Rok*_* Ge 8 asp.net-mvc webforms asp.net-mvc-routing
我在这里有一个混合使用webform和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
);
Run Code Online (Sandbox Code Playgroud)
因此,"上传/新建"的虚拟路径实际上映射到aspx webform页面.
但我的问题是Html.ActionLink("测试","控制器","动作")现在呈现
/上传/新?控制器=控制器和行动=行动
看了MVC源代码后,我理解这是因为ActionLink调用RouteCollection.GetVirtualPath(requestContext,routeName,mergedRouteValues),其中routeName为空.并且不知何故,这默认使用AspxRoute路由来构建url.我试图在"AspxRoute"之前添加另一条路线,但它似乎总是默认为非mvc路由处理器.
当routeName为null时,RouteCollection.GetVirtualPath的行为如何?为什么它对我的情况表现如此?
如何构建正确的URL?我是否需要编写新的Htmlhelper扩展?
干杯
另一种选择是为WebFormRoute添加自定义约束.例如,您可以创建IRouteConstraint的实现来匹配RouteDirection.IncomingRequest,然后使用它来确保路由被Server-Generated路由(例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将约束添加到您的路由:
routes.Add("AspxRoute", new Route("Upload/New", null,
new RouteValueDictionary() { {"WebFormsConstraint", new IncomingOnlyRouteConstraint()} },
new WebFormRouteHandler<Page>("~/Uploads.aspx")));
Run Code Online (Sandbox Code Playgroud)
当然你可能更喜欢添加自己的约束风格,这个限制在实现它的路线上,但它只是一种解决问题的方法的例子.
尝试:
<%=Html.RouteLink("Test", "Default", new {controller = "Controller", action = "Action"})%>
Run Code Online (Sandbox Code Playgroud)
使用 RouteLink 而不是 ActionLink 允许您指定要使用的路由,在本例中是默认 MVC 路由映射,而不是您添加的自定义路由映射。
| 归档时间: |
|
| 查看次数: |
3427 次 |
| 最近记录: |