如何解决使URL小写任何简单或内置的方式?
| 是否有任何简单/内置的方式来使MVC3的URL小写。 我有可以做到的代码,但是看起来很容易实现。 routes.MapRouteLowercase(
\"Default\",// Route name
\"{controller}/{action}/{id}\",// URL with parameters
new { controller = \"Home\",action = \"index\",id = UrlParameter.Optional } // Parameter defaults
);
public class LowercaseRoute : Route
{
public LowercaseRoute(string url,IRouteHandler routeHandler)
: base(url,routeHandler)
{
}
public LowercaseRoute(string url,RouteValueDictionary defaults,defaults,RouteValueDictionary constraints,constraints,RouteValueDictionary dataTokens,dataTokens,routeHandler)
{
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary values)
{
VirtualPathData path = base.GetVirtualPath(requestContext,values);
if (path != null)
{
path.VirtualPath = path.VirtualPath.ToLowerInvariant();
}
return path;
}
}
public static class RouteCollectionExtensions
{
public static Route MapRouteLowercase(this RouteCollection routes,string name,string url)
{
return routes.MapRouteLowercase(name,url,null /* defaults */,(object)null /* constraints */);
}
public static Route MapRouteLowercase(this RouteCollection routes,string url,object defaults)
{
return routes.MapRouteLowercase(name,object defaults,object constraints)
{
return routes.MapRouteLowercase(name,null /* namespaces */);
}
public static Route MapRouteLowercase(this RouteCollection routes,string[] namespaces)
{
return routes.MapRouteLowercase(name,null /* constraints */,namespaces);
}
public static Route MapRouteLowercase(this RouteCollection routes,object constraints,string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException(\"routes\");
}
if (url == null)
{
throw new ArgumentNullException(\"url\");
}
Route route = new LowercaseRoute(url,new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),Constraints = new RouteValueDictionary(constraints),DataTokens = new RouteValueDictionary()
};
if ((namespaces != null) && (namespaces.Length > 0))
{
route.DataTokens[\"Namespaces\"] = namespaces;
}
routes.Add(name,route);
return route;
}
public static Route MapRouteLowercase(this AreaRegistrationContext context,string url)
{
return context.MapRouteLowercase(name,(object)null /* defaults */);
}
public static Route MapRouteLowercase(this AreaRegistrationContext context,object defaults)
{
return context.MapRouteLowercase(name,(object)null /* constraints */);
}
public static Route MapRouteLowercase(this AreaRegistrationContext context,object constraints)
{
return context.MapRouteLowercase(name,null /* namespaces */);
}
public static Route MapRouteLowercase(this AreaRegistrationContext context,string[] namespaces)
{
return context.MapRouteLowercase(name,(object)null /* defaults */,namespaces);
}
public static Route MapRouteLowercase(this AreaRegistrationContext context,string[] namespaces)
{
if (namespaces == null && context.Namespaces != null)
{
namespaces = context.Namespaces.ToArray();
}
Route route = context.Routes.MapRouteLowercase(name,namespaces);
route.DataTokens[\"area\"] = context.AreaName;
// disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up
// controllers belonging to other areas
bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);
route.DataTokens[\"UseNamespaceFallback\"] = useNamespaceFallback;
return route;
}
}
解决方法
我刚刚注意到.NET Framework 4.5中有一个新属性。很棒!
RouteCollection.LowercaseUrls
将LowercaseUrls设置为true
public static void RegisterRoutes(RouteCollection routes)
{
routes.LowercaseUrls = true;
...
}
建立连结
@Html.ActionLink(\"Log in\",\"Login\",\"Account\")
这将创建一个很棒的小写网址:)
<a href=\"/account/login\">Log in</a>
, 有一个适用于此的NuGet软件包:LowerCaseRoutesMVC(项目网站)
, 如果您强制执行小写字母的原因纯粹是SEO,那么我发现的最佳解决方案是使用IIS 7 URL重写模块
您不仅可以强制将所有url转换为小写字母,而且还可以访问允许删除/添加尾部斜杠,强制使用规范域等规则。
RuslanY的Blog具有良好的起点。例如,我在所有网站上使用以下内容:
<!-- http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/ -->
<rule name=\"Convert to lower case\" stopProcessing=\"true\">
<match url=\".*[A-Z].*\" ignoreCase=\"false\" />
<conditions>
<add input=\"{REQUEST_METHOD}\" matchType=\"Pattern\" pattern=\"GET\" ignoreCase=\"false\" />
</conditions>
<action type=\"Redirect\" url=\"{ToLower:{R:0}}\" redirectType=\"Permanent\" />
</rule>
您只需将以上几行添加到web.config的部分中。
, 是的,我不得不实施与上述类似的操作。这似乎是完成此操作的唯一平滑方法。
我想补充一点,我们添加了301重定向,以便来自/ Upper-Case-Url的所有流量都将301重定向到/ upper-case-url。
, 不确定您的代码有什么问题(我的代码有些不同,但本质上是相同的概念)。它非常容易实现,并且可以完全重用。
LowerCaseRouteHelper.cs
using System.Web.Routing;
using System.Web.Mvc;
namespace Utilities.Helpers
{
public class LowercaseRouteHelper : System.Web.Routing.Route
{
public LowercaseRouteHelper(string url,IRouteHandler routeHandler) : base(url,routeHandler)
{
}
public LowercaseRouteHelper(string url,RouteValueDictionary defaults,defaults,RouteValueDictionary constraints,constraints,RouteValueDictionary dataTokens,dataTokens,routeHandler)
{
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary values)
{
VirtualPathData path = base.GetVirtualPath(requestContext,values);
if (path != null) {
path.VirtualPath = path.VirtualPath.ToLowerInvariant();
}
return path;
}
}
public static class RouteCollectionExtensions
{
[System.Runtime.CompilerServices.Extension()]
public static void MapRouteLowercase(RouteCollection routes,string name,string url,object defaults)
{
routes.MapRouteLowercase(name,url,null);
}
[System.Runtime.CompilerServices.Extension()]
public static void MapRouteLowercase(RouteCollection routes,object defaults,object constraints)
{
if (routes == null) {
throw new ArgumentNullException(\"routes\");
}
if (url == null) {
throw new ArgumentNullException(\"url\");
}
object route = new LowercaseRouteHelper(url,new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(defaults),Constraints = new RouteValueDictionary(constraints)
};
if (String.IsNullOrEmpty(name)) {
routes.Add(route);
} else {
routes.Add(name,route);
}
}
}
}
全球
routes.MapRouteLowercase(\"Start\",\"\",new {
controller = \"Home\",action = \"Index\"
})
我喜欢这个,最棒的是(如评论所述)它确实有助于改善SEO。
, 大声笑你们使这种方式对自己太难了。只需将其添加到您的global.asax application_beginrequest ...
protected void Application_BeginRequest(Object sender,EventArgs e) {
string url = (Request.Url.Scheme + \"://\" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
if (Regex.IsMatch(url,@\"[A-Z]\")) {
PermanentRedirect(url.ToLower() + HttpContext.Current.Request.Url.Query);
}
private void PermanentRedirect(string url) {
Response.Clear();
Response.Status = \"301 Moved Permanently\";
Response.AddHeader(\"Location\",url);
Response.End();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。