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.
我正在开发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.