0

Area私のMVC 4プロジェクトにはこの単純なユーザーがいます。

public class UserAreaRegistration : AreaRegistration
{
    public override string AreaName { get { return "User"; } }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute("User_Constraint",
                "{userName}/{controller}/{action}/{id}",
                new { userName = string.Empty, controller = "Products", action = "Index", id = UrlParameter.Optional },
                new { userName = new UserNameRouteConstraint() },
                new[] { "T2b.Web.Areas.User.Controllers" }
            );
    }
}

ユーザー名が存在することを確認するためにRouteConstraintUserNameRouteConstraint()

これはすべて、usersテーブルでの単純なルックアップであり、ユーザーが見つかった場合はtrueを返します。

これまでのところ、この構造は問題なく機能します。

今; ユーザーの私のビューにAreaは、次のコード行があります

@Html.ActionLink("More information", "details", new {id = product.Guid})

この1行で、UserNameRouteConstraint()が呼び出されます。

方法と理由!?リンクをわかりやすく書くとHTML(以下の例を参照)、うまく機能しますが、MVC原則をできるだけ忠実に守りたいと思います。

<a href="/username/Products/details/@product.Guid">More information</a>

RouteConstraint通話を防ぐ方法はありますか?

4

2 に答える 2

1

ルートが生成されるたびに、制約が処理されます。

このチェックを追加して、制約が着信要求を処理しているか、次のような関数からURLを生成しているかに応じて、制約を停止できますActionLink

public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
    if(routeDirection == RouteDirection.UrlGeneration)
        return false;

    ...
}
于 2012-12-07T21:12:01.167 に答える
0

ActionLink舞台裏で呼び出すと、が作成されてRouteValueDictionary実行されRouteCollection.GetVirtualPath()ます。この部分はオープンソースではありませんが、どのように機能するかについての私の最も良い推測は、生成されたルート値ディクショナリのパラメータを、一致するものが見つかるまで各ルートのデフォルトと制約に対してチェックすることです。このため、制約が実行され、間違ったルートに一致しないように制約を実行する必要があります。

于 2012-12-07T21:13:35.153 に答える