6

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を指定した場合(かみそりのスニペットに表示されるように)、lineNumberパラメーターは現在のルート値からその値を取得します。

これはT4MVCのバグである可能性があると思うので、このトピックへのリンクをT4MVCコードプレックスサイトにも投稿します。前もって感謝します!

4

1 に答える 1

3

2012 年 7 月 30 日更新:これは T4MVC 2.10.1 で修正されました。

これは実際には、モデル unbinder の変更による最近の回帰でした。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);
    }

元の回答: MVC では一般的に、値が新しいルートから省略される多くのシナリオでは、高レベルの値が同じであると仮定して、現在のルートからその値を取得すると思います (したがって、2 つの異なるケースが表示されます)。

したがって、問題は、T4MVC がこの動作を回避するために何かできる/すべきかどうかです。正確なロジックを確認していませんが、ルートで常にこの値を設定すると、この望ましくない動作が無効になる可能性があります。

しかし、最初のステップは、T4MVC のケースに取り組む前に、ここで行われている MVC の動作を完全に理解することだと思います。

気軽に調査を進めて、修正とともに PR を送ってください。:)

于 2012-07-22T20:52:37.803 に答える