Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Url路由到小写如何?_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

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
        );
    }
}
也可以使用IIS
Url重写
模块(使用
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发布的内容。