我注意到我认为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网站上发布这个主题的链接。提前谢谢!
答案 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修复! :)