2013-10-09 6 views
0

J'ai mon besoin de générer mon URL commeMVC Blog URL de routage

/2013/10/custome-mvc-url-rout-to-display-mixture-of-id-and-urlslug 

J'ai vu beaucoup de questions pour y parvenir & ma question peut avoir la possibilité de dupliquer .. Comme: -

asp-net-mvc-framework-part-2-url-routing

custome-mvc-url-rout-to-display-mixture-of-id-and-urlslug

etc ...

Je l'ai réalisé comme suit: -

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
routes.MapRoute(
    "Post", 
    "{year}/{month}/{title}", 
    new { controller = "Blog", action = "Post" } 
    ); 

et mon lien hypertexte qui générerait ce serait: -

@Html.ActionLink("continue...", "post", "blog", 
new { 
    year = Model.PostedOn.Year, 
    month = Model.PostedOn.Month, 
    day = Model.PostedOn.Day, 
    title = Model.UrlSlug 
}, new { title = "continue..." }) 

Mon contrôleur MVC étant: -

public ViewResult Post(int year, int month, string title) 
     {} 

Mais la question ici est, je reçois mon URL comme:

http://localhost:2083/blog/post?Year=2013&Month=10&Day=9&title=best_practices_in_programming 

et non pas comme: -

http://localhost:2083/blog/post/2013/10/best_practices_in_programming 

Qu'est-ce que je fais mal? S'il vous plaît quelqu'un peut le signaler.

Thnks!

+0

pouvez-vous poster vos itinéraires? spécifiquement l'ordre des routes (poste et par défaut). Je pense que l'itinéraire devrait être 'routes.MapRoute ( " Post ", " blog/poste/{année}/{mois}/{titre} ", nouveau {controller =" Blog ", action =" Post "} ', Sinon les segments pourraient entrer en conflit avec l'itinéraire par défaut. – shakib

Répondre

0

J'ai essayé et cela a fonctionné aussi longtemps que vous mettez cette voie avant que la route par défaut dans RouteConfig.cs comme ceci:

routes.MapRoute(
       null, 
       "{year}/{month}/{title}", 
       new { controller = "Blog", action = "Post" }, 
       new { year = @"\d+", month = @"\d+", title = @"[\w\-]*" }); 

Vous devez également modifier le titre à utiliser au lieu de traits d'union underscores l'OMI. Voici une bonne aide pour le faire.

#region ToSlug(), AsMovedPermanently 
    public static class PermanentRedirectionExtensions 
    { 
     public static PermanentRedirectToRouteResult AsMovedPermanently 
      (this RedirectToRouteResult redirection) 
     { 
      return new PermanentRedirectToRouteResult(redirection); 
     } 
    } 

    public class PermanentRedirectToRouteResult : ActionResult 
    { 
     public RedirectToRouteResult Redirection { get; private set; } 
     public PermanentRedirectToRouteResult(RedirectToRouteResult redirection) 
     { 
      this.Redirection = redirection; 
     } 
     public override void ExecuteResult(ControllerContext context) 
     { 
      // After setting up a normal redirection, switch it to a 301 
      Redirection.ExecuteResult(context); 
      context.HttpContext.Response.StatusCode = 301; 
      context.HttpContext.Response.Status = "301 Moved Permanently"; 
     } 
    } 



    public static class StringExtensions 
    { 
     private static readonly Encoding Encoding = Encoding.GetEncoding("Cyrillic"); 

     public static string RemoveAccent(this string value) 
     { 
      byte[] bytes = Encoding.GetBytes(value); 
      return Encoding.ASCII.GetString(bytes); 
     } 



     public static string ToSlug(this string value) 
     { 
      if (string.IsNullOrWhiteSpace(value)) 
      { 
       return string.Empty; 
      } 

      var str = value.RemoveAccent().ToLowerInvariant(); 

      str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); 

      str = Regex.Replace(str, @"\s+", " ").Trim(); 

      str = str.Substring(0, str.Length <= 200 ? str.Length : 200).Trim(); 

      str = Regex.Replace(str, @"\s", "-"); 

      str = Regex.Replace(str, @"-+", "-"); 

      return str; 
     } 
    } 
    #endregion 

Ensuite, vous devez également avoir une aide qui remplace chaque trait d'union par un espace dans le titre de paramètre url que vous passerez probablement à l'action contrôleur post pour interroger la Poste dans le DB.