Html.ActionLink在预期中的行为不正常

10 浏览
0 Comments

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

实际结果:

Foo Link

我的期望结果:

Foo Link

我尝试在当前项目之外启动一个新项目,并看到了预期的结果。我手动将MVC添加到了这个原本是WebForms应用程序的项目中。这是一种混合形式,我不确定是否会引起问题。我使用nuget引入了MVC程序集和依赖项,并根据VS中的“新项目...”模板的输出自己设置了配置。除了我包含了我们的根命名空间以便使用我预先存在的类型外,我没有看到两者之间的任何差异。然而,我不知道是否还需要做其他的事情。这让人困惑,因为除此之外,MVC在这种混合环境中的行为完全符合我的预期。

0
0 Comments

问题的原因是在路由配置中,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路由”,并将其作为一个功能实现。

0
0 Comments

问题出现的原因:使用Html.ActionLink时,参数的顺序不正确。

解决方法:将参数按照正确的顺序重新排列。

0