2009-08-04 4 views
3

Kann mir jemand helfen? Ich mache einige Tests in ASP.NET MVC.Wie bekomme ich eine nette URL wie "http://stackoverflow.com/questions/1074/asp-mvc"

Ich möchte die nette URL als Stackoverflow.com Routing-System implementieren.

Zum Beispiel: stackoverflow.com/questions/1074/asp-mvc domain.com/id/title

Hier ist mein Code:

  1. in der Global.asax

    routes.MapRoute (null, "posts/{PostId}/{Title}", neu {controller = "Beiträge", action = "Details", post = (string) null}, new {PostId = @ "\ d +", Ti tle = @ "([A-Za-z0-9 -] +)"} );

  2. in der Ansicht:

Mit diesen Codes, ich bin geting die url: http://localhost:53171/posts/Details?PostID=5&Title=Test-title

Kann mir einer ein raten?

Vielen Dank.

Antwort

3

nicht sicher, was alle von der Stackoverflow-URL bedeuten, aber wenn man eine saubere URL wie gewünscht:

https://stackoverflow.com/Questions/132/thetitle

In Ihrem Global.asax: die

routes.MapRoute("PostController", 
     "Questions/{post_id}/{post_title}", 
     new { controller = "Post", action = "Index" }, 
     new { post_id = @"\d+", post_title = @"([A-Za-z0-9-]+)" } 
    ); 

In Ihrem Controller abrufen Werte:

public ActionResult Index(Int32 post_Id, String post_title) 
    { 
     return View(); 
    } 

Um die richtige URL zu erzeugen, verwenden Sie Htm l.RouteLink:

<%= Html.RouteLink("The Title", "PostController", new { post_id = 132, post_title = "thetitle" })%> 
0

Sie auf dem richtigen Weg sind, aber Sie müssen nur auf die Objekt Route Werte in Ihrem Html.ActionLink den Namen Ihres Controllers ActionMethod Parameter anzupassen.

public ActionResult Index(int PostId, string Title) 
{ 
    ... 
    return View(); 
} 

<%= Html.ActionLink(Model.Title, "Details", 
    new { PostId = Model.PostID, Title = Model.Title}) %> 
1

Ich denke, Sie müssen einige Standardwerte in Ihre Route für den Posttitel ... und stellen Sie sicher, dass sie durch. Sie scheinen keine Standardwerte für "postId" und "title" zu haben, und Sie haben einen für einen nicht existenten Post-Route-Wert.

routes.MapRoute(
    "PostDetails", 
    "posts/{postId}/{title}", 
    new { controller = "Posts", action = "Details", postId = 0, title = "" }, 
    new { PostId = @"\d+", Title = @"([A-Za-z0-9-]+)" } 
); 

Beiträge Controller

public ActionResult Details(int postId, string title) 
{ 
    //whatever 
} 

Dann Ihrer Ansicht nach

<%= Html.ActionLink(Model.Title, "Details", new { @postId = Model.PostID, @title = Model.Title }) %> 

Oder

<%= Html.ActionLink(Model.Title, "Details", "Posts", new { @postId = Model.PostID, @title = Model.Title }, null) %> 

Ich würde auch vorschlagen, eine TitleSlug Eigenschaft auf Ihre Beiträge Modells.

z. (Code genommen von here)

public partial class Post 
{ 
    public string TitleSlug 
    { 
     get 
     { 
      string str = Title.ToLower(); 

      str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); // invalid chars  
      str = Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space 
      str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim(); // cut and trim it 
      str = Regex.Replace(str, @"\s", "-"); // hyphens 

      return str; 
     } 
    } 
} 

HTHS
Charles

Verwandte Themen