Asp.net mvc Url路由到小写如何?
Asp.net mvc Url路由到小写如何?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我已经在asp.net mvc3上开发了一个Web应用程序,现在我需要制作小写的路由 示例: that's what i have: http://www.example.com/SubFolder/Category/Index => looks ugly :-) that's how i would like it: http://www.example.com/subfolder/category/index 我找到了这个帖子: 我实际上需要使用页面底部global.as
我已经在asp.net mvc3上开发了一个Web应用程序,现在我需要制作小写的路由
示例:
that's what i have:
http://www.example.com/SubFolder/Category/Index => looks ugly :-)
that's how i would like it:
http://www.example.com/subfolder/category/index
我找到了这个帖子:我实际上需要使用页面底部global.asax中的代码
protected void Application_BeginRequest(Object sender, EventArgs e)
{
string lowercaseURL = (Request.Url.Scheme + "://" +
HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
{
lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", lowercaseURL);
Response.End();
}
}
现在的问题是:当在开发站上使用它时,它的工作是完美的,但当我将它上传到生产时,它就不工作了 在dev station上,它只制作post,但在制作中,它有两个功能:
POST - status: 301 Moved Permanently
GET - status: 200 OK
我根本没有被重定向到正确的路线。
在开发人员工作站上,它工作得非常好。因为您使用的是ASP.NET MVC,我不认为
应用程序\u BeginRequest
是一种好方法。MVC提供了更好的选项来处理这些需求
protected void Application_BeginRequest(Object sender, EventArgs e)
{
string lowercaseURL = (Request.Url.Scheme +
"://" +
HttpContext.Current.Request.Url.Authority +
HttpContext.Current.Request.Url.AbsolutePath);
if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
{
System.Web.HttpContext.Current.Response.RedirectPermanent
(
lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query
);
}
}
也可以使用IISUrl重写
模块(使用Web.config
configuration)来实现,但我认为您更喜欢一种编程方法
尝试使用ActionFilter
:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class EnforceLowercaseUrlAttribute : ActionFilterAttribute
{
private bool _redirect;
public EnforceLowercaseUrlAttribute(bool redirect = true)
{
this._redirect = redirect;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var path = request.Url.AbsolutePath;
var containsUpperCase = path.Any(char.IsUpper);
if (!containsUpperCase || request.HttpMethod.ToUpper() != "GET")
return;
if (this._redirect)
filterContext.Result = new RedirectResult(path.ToLowerInvariant(), true);
filterContext.Result = new HttpNotFoundResult();
}
}
然后将其应用于控制器/操作:
[EnforceLowercaseUrl]
public ActionResult Index()
{
....
}
或者在您的Global.asax中全局注册它:
GlobalFilters.Filters.Add(new EnforceLowercaseUrlAttribute());
我是这样做的,我创建了一条自定义路线。这也使得像Html.ActionLink
这样的助手也可以创建被操纵的路由
首先,我用一个自定义对象扩展Route
(比方说lowercasseroute
)并覆盖GetVirtualPath
方法,如下所示:
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var path = base.GetVirtualPath(requestContext, values);
if (path != null)
{
// you could do lots more here, like replacing odd characters with - etc.
path.VirtualPath = path.VirtualPath.ToLower();
}
return path;
}
public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults)
{
var route = new LowerCaseRoute(url, new MvcRouteHandler());
route.Defaults = new RouteValueDictionary(defaults);
route.DataTokens = new RouteValueDictionary();
route.DataTokens.Add("RouteName", name);
routes.Add(name, route);
return route;
}
RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional });
然后,我创建一个自定义帮助器来映射此路线,如下所示:
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var path = base.GetVirtualPath(requestContext, values);
if (path != null)
{
// you could do lots more here, like replacing odd characters with - etc.
path.VirtualPath = path.VirtualPath.ToLower();
}
return path;
}
public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults)
{
var route = new LowerCaseRoute(url, new MvcRouteHandler());
route.Defaults = new RouteValueDictionary(defaults);
route.DataTokens = new RouteValueDictionary();
route.DataTokens.Add("RouteName", name);
routes.Add(name, route);
return route;
}
RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional });
这样,您可以在global.asax中创建路由,如下所示:
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var path = base.GetVirtualPath(requestContext, values);
if (path != null)
{
// you could do lots more here, like replacing odd characters with - etc.
path.VirtualPath = path.VirtualPath.ToLower();
}
return path;
}
public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults)
{
var route = new LowerCaseRoute(url, new MvcRouteHandler());
route.Defaults = new RouteValueDictionary(defaults);
route.DataTokens = new RouteValueDictionary();
route.DataTokens.Add("RouteName", name);
routes.Add(name, route);
return route;
}
RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional });
这可以使项目内的一切保持整洁和明显,并为您提供更多的选项来操作路由。如果这只是为了搜索引擎优化,最简单的解决方案,也是我会使用的解决方案是使用url重写(假设您在IIS上托管)或mod rewrite(如果您在Apache上托管)强制使用小写URL并保持帖子的原样
使用IIS,只需从web平台安装程序安装url重写,点击添加规则并选择“强制使用小写url”即可。简单
如果升级到mvc4并且确实需要小写的帖子,那么在注册路由时可以将属性LowercaseUrls
设置为true。不过,我也不介意。ASP.NET URL不区分大小写,重定向到小写URL有什么意义?您正在创建重定向的开销。另外,POST上的重定向永远不会正常工作。您所需要做的就是更改HTML以反映小写URL。而且,并没有这样的法律规定上档url是坏的,并没有人会看它。唯一重要的地方是robots.txt,它区分大小写。@PKKG,否,SEO不区分大小写,而且如果引用链接有不同的大小写,重定向到不同的大小写可能会损害SEO,因为它是不同的词,如果它区分大小写。@iamstapper:您能添加一个答案或建议吗?因为你接受了答案。不幸的是,被接受的答案现在被删除了。你想要我的问题的答案吗?非常有趣的问题。你的开发web.config和部署web.config之间有什么区别吗?哈哈,为什么你要使用true两次呢?每个动作或控制器都有逻辑性和个性化。还有太多的代码。我错了,我以为我把它默认为false。修正了。你总是返回404。这不是最好的方法。为什么要在应用程序中使用它,而IIS可以为您处理它?@Terry:您可以添加您的答案吗?我可以再次开始悬赏现有的答案。相信我!!!!正在等待您的回答……我希望您能给我另一个答案,但如果您无法访问iis服务器?@abcdefhi当然。回答没有意义,因为这正是bigfllahull发布的内容。