2009-07-02 13 views
7

Moim celem jest mieć routing url następujące:ASP.NET MVC SEO URL

http://www.abc.com/this-is-peter-page 

http://www.abc.com/this-is-john-page 

Co jest najprostszym sposobem, aby to osiągnąć bez wprowadzania nazwy kontrolera nazwa funkcji w url powyżej? Jeśli strona powyżej nie zostanie znaleziona, powinienem przekierować do 404 strony.

Addon 1: strona ta-peter-page i strona-to-john nie jest statyczną treścią, ale pochodzi z bazy danych.

+0

Czy "this-is-Peter-page" strona statyczny lub dynamiczny, gdzie "this-is-Peter-page" byłoby pole w bazie danych ? – Pablo

+0

Jest to z bazy danych –

Odpowiedz

9

Podobny do realizacji KingNestor, można również wykonać następujące czynności, które ułatwią pracę:

1) Napisz model

public class MyUser{public String UserName{get; set;}} 

2) dodać trasę do globalnego asax

routes.MapRoute(
    "NameRouting", 
    "{name}", 
    new { controller = "PersonalPage", action = "Index", username="name" }); 

3) Rzuć własny niestandardowy segregator modelowy pochodzący z IModelBinder

public class CustomBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      var request = controllerContext.HttpContext.Request; 
      var username = getUserNameFromDashedString(request["username"]); 
      MyUser user = new MyUser(username); 

      return user; 
     } 
    } 

4) w swoim działaniu:

public ActionResult Index([ModelBinder(typeof(CustomBinder))] MyUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.Username; 
    return View(); 
} 
+0

Tak, dziękuję za ten dodatek do wdrożenia KingNestor –

+0

Dzięki Zhaph do ponownego ustalenia kroku 3 i kroku 4 –

+0

Znalazłem bindingContext nie zawiera HttpContext –

4

Ja osobiście nie sugerowałoby trasy takiego ale jeśli spełnia swoje potrzeby trzeba zrobić coś takiego:

mieć następującą trasę w pliku Global.asax:

routes.MapRoute(
     "NameRouting", 
     "{name}", 
     new { controller = "PersonalPage", action = "routeByName" }); 

Następnie w swojej "PersonalPageController", mają następujące metody:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult routeByName(string name) 
    { 
     switch (name) 
     { 
      case "this-is-peter-page": return View("PeterView"); 
      case "this-is-john-page": return View("JohnView"); 
      case Default: return View("NotFound"); 
     } 
    } 

Sprawdź, czy masz odpowiednie widoki: "PeterView", "JohnView" i "NOTFOUND" w Wyświetlenia/PersonalPage/.

+0

Można połączyć to z ograniczeniem trasy, aby zapobiec "niechcianym" żądaniom, aby przejść do tego kontrolera. (Zakładam, że nadal potrzebujesz innego kontrolera). – chris166

+0

jak zapobiec "niechcianym" żądaniom? –

+1

@ Argus Ter, możesz podać ograniczenia trasy, które ograniczają tę trasę do określonego wyrażenia regularnego. – mmcdole

2

Nie sądzę, aby to można było zrobić. AFAIK ASP.NET MVC rozpoznaje parametry routingu za pomocą znaku "/".

Z drugiej strony, twój format przechodzi przez "{kontroler} -is- {id} - {czynność}" - więc nie ma możliwości odróżnienia kontrolera od id i akcji.

Myślę, że używanie znaków "/" nie wpływa ani nie pogarsza SEO; wpływa tylko na czytelność i zachowanie adresu URL.

Zresztą następujący adres URL jest możliwe: http://www.abc.com/this-is-the-page-of/Peter dodając kolejną trasę w sposobie Global.asax RegisterRoutes:

 routes.MapRoute(
      "AnotherRoute", 
      "this-is-the-page-of/{id}", 
      new { controller = "PersonalPage", action = "Details", id = "" } 
     ); 

... zakładając, że PersonalPageController implementuje metodę Szczegóły ActionResult wskazujący do żądanej strony.