Html.ActionLink构建在添加非MVC路线错误的链接(Html.ActionLink co

2019-07-19 06:58发布

我这里用的表单,MVC的混合应用。 我指定如下路由

        routes.Add("AspxRoute", new Route("Upload/New", new WebFormRouteHandler<Page>("~/Uploads.aspx")));

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );   

这样虚拟路径“上传/新建”实际上映射到一个aspx页面的网页表单。

但我的问题是,Html.ActionLink(“测试”,“控制器”,“行动”)现在呈现

/上传/新?控制器=控制器和行动=行动

说完看着MVC的源代码,我明白,这是因为ActionLink的调用RouteCollection.GetVirtualPath(RequestContext的,routeName,mergedRouteValues) ,其中routeName留给空。 并以某种方式默认为需使用AspxRoute路由构造URL。 我想“AspxRoute”之前添加另一条路线,但似乎总是默认为不MVC routehandler之一。

如何RouteCollection.GetVirtualPath行为时routeName为空? 为什么它表现这样我的情况?

如何构建一个正确的网址是什么? 我是否需要写一个新的HtmlHelper扩展?

干杯

Answer 1:

另一种选择是一个自定义的约束添加到您的WebFormRoute(S)。 例如,您可以创建IRouteConstraint的实现相匹配RouteDirection.IncomingRequest,然后用它来确保路由是由服务器生成的路由(如ActionLink的),但仍通过客户端生成的请求中使用忽略。 就像是:

public class IncomingOnlyRouteConstraint: IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (routeDirection == RouteDirection.IncomingRequest)
        {
            return true;
        }
        return false;
    }
}

然后将约束添加到您的路线:

routes.Add("AspxRoute", new Route("Upload/New", null, 
                            new RouteValueDictionary() { {"WebFormsConstraint", new IncomingOnlyRouteConstraint()} }, 
                            new WebFormRouteHandler<Page>("~/Uploads.aspx")));

当然,你可能更愿意加约束你自己的风格,这是一个相当限制实现它的路线上,但它只是你能解决这个问题的一种方法的例子。



Answer 2:

尝试:

<%=Html.RouteLink("Test", "Default", new {controller = "Controller", action = "Action"})%>

使用而不是ActionLink的RouteLink允许您指定要使用的路径,在这种情况下是不是你已经添加了自定义的默认MVC路由映射。



Answer 3:

另外:请确保您的默认路由是在路由表中的最后一项。 这是用HTML排序操作链接的你要拉闸其他简便方法。



Answer 4:

强制路径默认为无控制器:

var routeDefaults = new RouteValueDictionary() { { "controller", null } };
routes.Add("RouteName", new Route("some/path", routeDefaults, new SomeHandler()));


Answer 5:

我的经历:路由工作正常“入站”同样的事情,但Html.ActionLink()是选错了路线。 我工作围绕它通过添加路由约束,使得controller必须是空的:

var constraints = new RouteValueDictionary()
{
    { "controller", string.Empty }
};

routes.Add(new Route("sso/server", null, constraints, new OpenIDServerRouteHandler()));

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{identity}",
    defaults: new { controller = "Pages", action = "Home", identity = UrlParameter.Optional }
);

由于“控制器”路线值被限制为什么,到ActionLink的()的调用最终忽略的路由。 希望这可以帮助别人!



文章来源: Html.ActionLink construct wrong link when a non-mvc route is added