6

我注意到我认为 T4MVC 的一些奇怪行为。具体来说,我正在尝试为可选参数值为 null 的操作构建 ActionLink(使用 HtmlHelper)。这在大多数情况下都可以正常工作。但是,如果当前路由与正在为其构建 ActionLink 的路由相同,并且 OptionalParameter 具有非空值,则生成的 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))

正如我之前提到的,如果我当前不在映射到此路由的视图上,则将正确生成链接。但是,如果当前视图确实映射了 this 路由,并且我要么省略该值,要么提供 null(如 razor 代码片段中所示),lineNumber 参数将从当前路由值中获取其值。

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

4

1 回答 1

3

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

这实际上是模型 unbinder 更改的最新回归。在第 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!:)

于 2012-07-22T20:52:37.803 回答