T4MVC OptionalParameter值从当前上下文暗示(T4MVC OptionalPar

2019-09-19 19:46发布

我发现了我认为是一些奇怪的行为与T4MVC。 具体来说,我试图建立一个ActionLink的(使用的HtmlHelper)的动作,其中可选的参数值为null。 这工作得很好大部分的时间。 然而,如果当前的路由是其中的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))

正如我前面提到的,如果我没有对当前被映射到这个路线图,该链接将被正确生成。 然而,如果当前视图确实映射这条路线与我要么省略值或供给空(如见于剃刀片断),则LINENUMBER参数会从当前路线值其值。

我想这可能是T4MVC个bug,因此我会后对T4MVC的CodePlex网站的链接到这个话题为好。 提前致谢!

Answer 1:

更新7/30/2012: 这是固定在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 /应该做些什么来避免这种行为。 我没有检查精确逻辑,但也许,如果它总是被设置在路线这个值,这将禁用此不受欢迎的行为。

但是,我认为第一步是要充分了解MVC行为,在这里打球是应对T4MVC案前。

随意采取进一步的调查,并派出一个公关与修复! :)



文章来源: T4MVC OptionalParameter values implied from current context