繁体   English   中英

MVC ActionLink是否触发RouteConstraint?

[英]MVC ActionLink triggers a RouteConstraint?

我的MVC 4项目中有一个简单的用户Area

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

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

所有这些操作都是在我的用户表中进行的简单查找,如果找到了该用户,则返回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调用吗?

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

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

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

    ...
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM