T4MVC当前上下文隐含的OptionalParameter值

时间:2012-07-19 17:29:52

标签: 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);
}

路线

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

剃刀

@Html.ActionLink("Show Today", MVC.Production.ProductionSchedules.Today(null))

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

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

1 个答案:

答案 0 :(得分:3)

2012年7月30日更新这在T4MVC 2.10.1中得到修复!

这实际上是最近从模型取消更改的回归。在第639行的t4mvc.tt中,您可以尝试将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);
    }

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

所以现在的问题是T4MVC能否/应该做些什么来避免这种行为。我没有检查确切的逻辑,但是如果它总是在路由中设置这个值,那将会禁用这种不需要的行为。

但我认为第一步是在解决T4MVC案件之前,完全理解在这里发挥作用的MVC行为。

随意进一步调查并发送PR修复! :)