routes.LowercaseUrls 和 routes.AppendTrailingSlash 在 MVC 中不起作用

routes.LowercaseUrls and routes.AppendTrailingSlash not work in MVC

我正在开发mv4网站,

你能告诉我为什么这些命令在我将它们写入 RouteConfig 时在我的应用程序中没有执行任何操作吗:

routes.LowercaseUrls = true;
routes.AppendTrailingSlash = true;

我想你对这些的作用感到困惑。

AppendTrailingSlash 的情况下,它所做的只是将 / 添加到 MVC 生成的路由的末尾。 (https://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.appendtrailingslash(v=vs.110).aspx)

同样,当您使用 LowercaseUrls 时,MVC 将生成全部小写的 URLS。 (https://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.lowercaseurls(v=vs.110).aspx)

这些不会像您期望的那样URL在客户端重写。

首先,您需要通过 @Html.ActionLink@Url.Action 或类似的东西生成路由才能正常工作。这不是灵丹妙药。

来自 MSDN:

AppendTrailingSlash

Gets or sets a value that indicates whether trailing slashes are added when virtual paths are normalized.

(Source)

LowercaseUrls

Gets or sets a value that indicates whether URLs are converted to lower case when virtual paths are normalized.

(Source)

URL格式为(source):

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

这影响的部分是路径部分,而且只是路径部分。 query-string 部分不受影响。 AppendTrailingSlash 在路径部分的末尾添加一个 /。

所以对于这段代码:

@Html.ActionLink("About this Website", "About")

将路由参数设置为 routes.LowercaseUrls = true;routes.AppendTrailingSlash = true; 它将生成:

<a href="/home/about/">About this Website</a>

将路由参数设置为 routes.LowercaseUrls = false;routes.AppendTrailingSlash = true; 它将生成:

<a href="/Home/About/">About this Website</a>

将路由参数设置为 routes.LowercaseUrls = true;routes.AppendTrailingSlash = false; 它将生成:

<a href="/home/about">About this Website</a>

将路由参数设置为 routes.LowercaseUrls = false;routes.AppendTrailingSlash = false; 它将生成:

<a href="/Home/About">About this Website</a>

对于此代码:

@url.action("someAction","someController",new{Name=Test})

将路由参数设置为 routes.LowercaseUrls = true;routes.AppendTrailingSlash = true; 它将生成:

/somecontroller/someaction/?Name=Test

您可能遇到的一些错误:
关于小写 Urls,MVC 4 中有一个 bug with areas

NuGet 包 LowercaseRoutesMVC 预报修复此错误。


应用程序中小写 URLs 的可能解决方案

如果您想改变应用程序之外的行为,请考虑使用 Url Rewrite for IIS which can transform your URLs. Example of this here.