我这里用的表单,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扩展?
干杯
另一种选择是一个自定义的约束添加到您的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")));
当然,你可能更愿意加约束你自己的风格,这是一个相当限制实现它的路线上,但它只是你能解决这个问题的一种方法的例子。
尝试:
<%=Html.RouteLink("Test", "Default", new {controller = "Controller", action = "Action"})%>
使用而不是ActionLink的RouteLink允许您指定要使用的路径,在这种情况下是不是你已经添加了自定义的默认MVC路由映射。
另外:请确保您的默认路由是在路由表中的最后一项。 这是用HTML排序操作链接的你要拉闸其他简便方法。
强制路径默认为无控制器:
var routeDefaults = new RouteValueDictionary() { { "controller", null } };
routes.Add("RouteName", new Route("some/path", routeDefaults, new SomeHandler()));
我的经历:路由工作正常“入站”同样的事情,但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的()的调用最终忽略的路由。 希望这可以帮助别人!