我注意到我认为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网站上发布这个主题的链接.提前致谢!
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!:)
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |