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()

所有这一切都是在我的用户表中进行简单的查找,如果找到了用户,则返回 true。

到目前为止一切顺利,这个结构工作正常!

现在; 我在用户Area中的视图具有以下代码行

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

这条单行导致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 回答