MVC ActionLink触发RouteConstraint?

时间:2012-12-07 20:57:09

标签: c# asp.net-mvc

我的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" }
            );
    }
}

为确保用户名存在,我有RouteConstraint名为UserNameRouteConstraint()

所有这一切都是在我的users表中进行简单查找,如果找到了用户则返回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来电?

2 个答案:

答案 0 :(得分:1)

每当生成路由时,都会处理约束。

您可以添加此检查以停止约束,具体取决于约束是处理传入请求还是从ActionLink等函数生成URL:

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

    ...
}

答案 1 :(得分:0)

当您在幕后调用ActionLink时,它会创建RouteValueDictionary并运行RouteCollection.GetVirtualPath()。这部分不是开源的,但我最好的猜测是它的工作原理是它根据每条路由的默认值和约束检查生成的路由值字典的参数,直到找到匹配的路由。因此它运行你的约束,你应该希望它运行你的约束,以便它不会最终匹配错误的路由。