Html.ActionLink在预期中的行为不正常
Html.ActionLink在预期中的行为不正常
我试图从Html.ActionLink获取一个漂亮的URL,但却得到了查询字符串版本。我定义了一个路由,在浏览器的导航栏中输入值时,它能完美地工作,并且能够获取视图并触发我认为应该触发的控制器动作。
我的路由定义:
routes.MapPageRoute(
"WebFormDefault",
"",
"~/Login.aspx"
);
routes.MapRoute(
"MvcDefault",
"{controller}/{action}/{id}",
new {controller = "Foo", action = "Index", id = UrlParameter.Optional}
);
我的助手调用标记:
- @Html.ActionLink("Foo Link", "FooAction", "Foo")
实际结果:
我的期望结果:
我尝试在当前项目之外启动一个新项目,并看到了预期的结果。我手动将MVC添加到了这个原本是WebForms应用程序的项目中。这是一种混合形式,我不确定是否会引起问题。我使用nuget引入了MVC程序集和依赖项,并根据VS中的“新项目...”模板的输出自己设置了配置。除了我包含了我们的根命名空间以便使用我预先存在的类型外,我没有看到两者之间的任何差异。然而,我不知道是否还需要做其他的事情。这让人困惑,因为除此之外,MVC在这种混合环境中的行为完全符合我的预期。
问题的原因是在路由配置中,MVC的路由在WebForm的路由之前,导致Html.ActionLink方法无法按照预期的方式工作。解决方法是将MVC的路由配置放在WebForm的路由配置之前。具体操作如下:
routes.MapRoute( "MvcDefault", "{controller}/{action}/{id}", new {controller = "Foo", action = "Index", id = UrlParameter.Optional} ); routes.MapPageRoute( "WebFormDefault", "", "~/Login.aspx" );
尽管不清楚为什么路由的顺序会影响Html.ActionLink方法的行为,但是这种调整路由顺序的方法确实有效。当存在多个路由时,首先满足条件的路由将起作用。
对于这个问题,作者认为运行时应该能够区分“显然是MVC路由”和“显然是WebForm路由”,并将其作为一个功能实现。