2010-03-03 1 views
11

Mi chiedo quale sia il modo migliore per gestire l'URL in MVC. Ad esempio, nella mia applicazione ho un collegamento PageController a /website/Page/Index/3 o /website/Page/home. Il menu è creato dinamicamente con Html.ActionLink() e T4MVC in base agli url in entrata, quindi non ho nulla di hardcoded.Riscrittura URL in .Net MVC

Ora quello che voglio fare è quello di puntare il mio URL e link a qualcosa di più SEO friendly come, per esempio, /website/our-company/ e può anche avere figli come /website/our-company/location/ o /website/our-company/employees/. Hai un'idea.

Tutte le mie pagine sono salvate sul BD e ho le proprietà FriendlyUrl e parentId nel mio oggetto.

Qual è il modo migliore per farlo?

+0

È meglio dare un'occhiata a: - [** Panoramica del routing MVC di ASP.NET (C#) **] (http://www.asp.net/learn/mvc/tutorial-05-cs.aspx) –

+0

I ora questa roba ma non sono abbastanza sicuro di come posso fare quello che sto cercando di fare qui, è possibile che il mio Html.ActionLink() reindirizzi a/website/our-company/location/quando indico MVC.Page.Index (12)? E come dovrebbe essere la mia rotta visto che non voglio la "Pagina", la strega è il controller, parte nel mio url? – VinnyG

risposta

5

Ok ho dato un'occhiata a http://www.asp.net/learn/mvc/tutorial-23-cs.aspx e ho funzionato. Più semplice di quanto insegnato ...

I miei itinerari:

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

     routes.MapRoute("Pages3", "{url1}/{url2}/{url3}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" }); 
     routes.MapRoute("Pages2", "{url1}/{url2}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" }); 
     routes.MapRoute("Pages1", "{url1}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" }); 

    } 

E ora il mio controller:

public virtual ActionResult RedirectTo(string url1, string url2, string url3) 
    { 
     if (string.IsNullOrEmpty(url1)) return Home(); 

     var pageModel = new PageModel(); 
     pageModel.CurrentPage = _pageRepo.GetByUrl(url1, url2, url3); 
     BuildMenusAndBreadCrumb(pageModel); 
     ViewData.Model = pageModel; 

     return View(Views.Index); 
    } 

E come fare rendo un link (il mio menu exemple) qui:

<div class="header_menu_content"> 
<ul id="main_menu_header"> 
    <% foreach(var item in Model) {%> 
     <% if(item.Children != null){ %> 
      <li><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", ""))%> 
      <ul> 
      <% foreach (var child in item.Children){ %> 
       <li><%= Html.ActionLink(child.Title, MVC.Page.RedirectTo(item.Url, child.Url, "")) %></li> 
      <% }%> 
      </ul> 
      </li> 
     <% } else { %> 
      <li class="nochild"><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", "")) %></li> 
     <% } %> 
    <%} %> 
</ul> 

Lavoro s perfettamente per i miei bisogni! Se hai domande o commenti non essere timido! Non sono sicuro che sia il modo migliore per farlo, ma sono contento!

Si noti che l'ordine del percorso è importante e inoltre, se non si inserisce il valore predefinito e si trova in una pagina in cui url2 = qualcosa (sito/sezione/pagina), tutti i collegamenti rimandano a sito/newsection? Url2 = pagina mi ci è voluto un po 'per capire perché l'url2 param era lì ma ora va tutto bene!