微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使URL小写任何简单或内置的方式?

如何解决使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 举报,一经查实,本站将立刻删除。