T4MVC当前上下文隐含的OptionalParameter值

Vin*_*lly 6 asp.net-mvc t4mvc

我注意到我认为T4MVC有些奇怪的行为.具体来说,我正在尝试为可选参数值为null的操作构建一个ActionLink(使用HtmlHelper).这在大多数情况下都可以正常工作.但是,如果当前路由与构建ActionLink的路径相同且OptionalParameter具有非null值,则生成的ActionLink将从当前路径上下文指定可选参数的值.

这是一个罗嗦的解释,我认为代码将有助于澄清.

调节器

public virtual ActionResult Today(int? lineNumber = null)
{
    return Index(DateTime.Today, DateTime.Today, lineNumber);
}
Run Code Online (Sandbox Code Playgroud)

路线

context.MapRoute(
    "TodaysProductionSchedules",
    "Production/{Controller}/Today/{lineNumber}",
    new
        {
            area = AreaName,
            controller = MVC.Production.ProductionSchedules.Name,
            action = MVC.Production.ProductionSchedules.ActionNames.Today,
            lineNumber = UrlParameter.Optional
        });
Run Code Online (Sandbox Code Playgroud)

剃刀

@Html.ActionLink("Show Today", MVC.Production.ProductionSchedules.Today(null))
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,如果我当前没有映射到此路由的视图,则将正确生成链接.但是,如果当前视图确实映射了此路由,并且我省略了值或提供null(如razor片段中所示),则lineNumber参数将从当前路由值中获取其值.

我认为这可能是T4MVC中的一个错误,所以我也会在T4MVC codeplex网站上发布这个主题的链接.提前致谢!

Dav*_*bbo 3

2012 年 7 月 30 日更新此问题已在 T4MVC 2.10.1 中修复!

这实际上是模型解绑器更改的最新回归。在 t4mvc.tt 中第 639 行左右,您可以尝试将 AddRouteValues 更改为以下内容:

    public static void AddRouteValues(RouteValueDictionary routeValueDictionary, string routeName, object routeValue) {
        IModelUnbinder unbinder;
        if (routeValue == null)
        {
            unbinder = DefaultModelUnbinder;
        }
        else
        {
            unbinder = ModelUnbinders.FindUnbinderFor(routeValue.GetType()) ?? DefaultModelUnbinder;
        }
        unbinder.UnbindModel(routeValueDictionary, routeName, routeValue);
    }
Run Code Online (Sandbox Code Playgroud)

原始答案:我认为一般在 MVC 中,在许多情况下,当从新路由中省略某个值时,它会从当前路由中获取其值,假设高级值是相同的(因此您会看到两种不同的情况)。

所以现在的问题是 T4MVC 是否可以/应该采取一些措施来避免这种行为。我还没有检查确切的逻辑,但也许如果它总是在路由中设置这个值,那就会禁用这种不需要的行为。

但我认为第一步是在处理 T4MVC 案例之前充分理解这里起作用的 MVC 行为。

请随意进一步调查并发送包含修复程序的 PR!:)