我有一个奇怪的问题。我正在开发一些设置为无扩展的MVC代码,如/Home/Index?id=10
中所示。但是,它曾经是为IIS 6设置的,并且在所有控制器上使用.mvc扩展名,如{{1} }}
我希望两条路线都能正常工作。在我的global.asax.cs文件中,我创建了以下代码:
/Home.mvc/Index?id=10
这几乎有效!但不幸的是,当我的控制器返回RedirectToAction时,生成的URL失败。
我这样调用RedirectToAction:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("Default2",
"{controller}.mvc/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
然后返回:
return RedirectToAction("Index", "Account");
现在假设索引,所以我并不担心这个缺失。但是,该URL末尾没有/Account.mvc
,因此,它返回404错误。如果我添加/
它可以正常工作。有什么方法可以帮助MVC正确生成URL,还是有办法修改路由以使其识别此URL?
背景:我遇到这种情况是因为在我们将网络服务器升级到IIS 7.5之后,我开始将我的应用程序转换为使用无扩展名的URL。我没有意识到与外部世界共享的应用程序有很多链接 - 改为无扩展程序打破了所有这些链接。卫生署!应该留下足够好的。
答案 0 :(得分:1)
我个人会使用URL Rewriter。你可以Redirect ASP.NET Legacy URLs to Extensionless with the IIS Rewrite Module。
例如,您可以创建一个类似的出站规则(不完全是,它们肯定需要测试):
<outboundRules>
<rule name="remove .mvc outbound 1">
<match serverVariable="RESPONSE_LOCATION"
pattern="^/(.*).mvc$" />
<action type="Rewrite" value="/{R:1}" />
</rule>
<rule name="remove .mvc outbound 2">
<match filterByTags="A, Form, IFrame, Img, Input, Link, Script"
pattern="^/(.*).mvc$" />
<action type="Rewrite" value="/{R:1}" />
</rule>
</outboundRules>
如果有人决定对MVC扩展程序进行硬编码......
<rule name="Add Slash Inbound">
<match url="(.*)" />
<conditions>
<add input="{PATH_INFO}" pattern="^/(.*).mvc$" negate="true" />
</conditions>
<action type="Rewrite" url="{R:0}/" />
</rule>
答案 1 :(得分:0)
通过在每个请求Add a trailing slash at the end of each url?的末尾添加/,在此处编写您的解决方案。如果还不够我们可以尝试别的东西:)
答案 2 :(得分:0)
对于任何想要解决这个问题的人:问题可能不是RedirectToAction正在生成错误的URL,而是实际上IIS没有正确解释该URL。
我发现其他服务器在原始问题中描述的URL中缺少斜杠没有问题。
这让我看看App Pool设置。特别是一个设置似乎会影响这一点:“启用32位应用程序”。在应用程序池上将此设置为true,使我的应用程序能够解析缺少尾随'/'。
的URL怪啊?