2016-03-17 19 views
0

我有一个网站,它的出现在浏览器llike这个网址:如何格式化我的ASP.NET MVC 5网站的URL

mysite.com/Produto/PaoDeMel

和搜索引擎优化的原因,我倒是希望它像:

mysite.com/produto/pao-de-mel

但我actionname是PaoDeMel,而框架并没有让我用‘ - ’上的名称。

是否有路由配置或其他任何东西来实现我的目标?

PS .:在How do I change the url in MVC 5?中建议的解决方案对我无效。

感谢

+0

这里有一些指导http://stackoverflow.com/questions/2787053/iis7-and-enforce-lowercase-urls – Jasen

+0

'ActionName'怎么不起作用?另一种方法是创建一个能够捕获URL的路由,并且有一个操作方法,将URL段转换为某个与您的数据库中的产品相对应的Id。 –

+0

您必须为“在MVC中翻译网址”创建您自己的“Routes”查找 –

回答

0

您需要实现IRouteHandlerIHttpHandler接口(在IHttpHandler的实现ProcessRequest方法特别注意):

public class MyRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new MyHttpHandler(); 
    } 
} 

public class MyHttpHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     // Take routes values to build a url string that can be handled by "Default" route 
     string url = "/" + context.Request.RequestContext.RouteData.Values["controller"].ToString().ToLower(); 
     url += "/" + (context.Request.RequestContext.RouteData.Values["part1"] as string).Replace("-", "").ToLower() + (context.Request.RequestContext.RouteData.Values["part2"] as string).Replace("-", "").ToLower(); 
     url += "/" + context.Request.RequestContext.RouteData.Values["id"]; 

     context.Server.TransferRequest(url, true); 
     } 
    } 

接着,添加处理默认和自定义路由路线:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { action = @"[^\-]*" } 
     ); 

    routes.Add("MyRoute", 
      new Route("{controller}/{part1}-{part2}/{id}", 
       new RouteValueDictionary { { "controller", "Home" }, { "action", "Index" }, { "id", "" } }, 
       new MyRouteHandler() // Custom route handler 
       ) 
     ); 
} 

无论有多少连字符都有你的网址在行动段(mysite.com/produto/pao- de-mel,mysite.com/produto/pao-de-mel-abc等),这将被“MyRoute”路由捕获,并将被​​处理,该路径将把路径转换成可以是通过“默认”路由处理,实现这一点,通过传输要被ASP.NET MVC路由的正常流程处理的请求。