2010-03-03 19 views
11

Me pregunto cuál es la mejor manera de manejar URL en MVC. Por ejemplo, en mi aplicación tengo un PageController que puede vincular a /website/Page/Index/3 o /website/Page/home. El menú se construye dinámicamente con Html.ActionLink() y T4MVC en función de las direcciones URL entrantes, por lo que no tengo nada codificado.Reescritura de URL en .Net MVC

Ahora lo que quiero hacer es apuntar mi url y enlaces a algo más amigable con el SEO como, por ejemplo, /website/our-company/ y también puede tener hijos como /website/our-company/location/ o /website/our-company/employees/. Entiendes la idea.

Todas mis páginas se guardan en el BD y tengo FriendlyUrl y parentId propiedades en mi objeto.

¿Cuál es la mejor manera de hacerlo?

+0

Mejor eche un vistazo a: - [** ASP.NET MVC Routing Overview (C#) **] (http://www.asp.net/learn/mvc/tutorial-05-cs.aspx) –

+0

I ahora esto, pero no estoy muy seguro de cómo puedo hacer lo que estoy tratando de hacer aquí, ¿es posible que mi Html.ActionLink() redirija a/sitio web/nuestra-compañía/ubicación/cuando señalo MVC.Page.Index (12)? ¿Y cómo debería ser mi ruta ya que no quiero que la "Página", que es el controlador, forme parte de mi url? – VinnyG

Respuesta

5

Ok Eché un vistazo a http://www.asp.net/learn/mvc/tutorial-23-cs.aspx y lo puse en funcionamiento. Más simple que me listada ...

Mis rutas:

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 = "" }); 

    } 

Y ahora mi controlador:

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); 
    } 

Y así es como me hacen un enlace (mi menú exemple):

<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> 

Trabajo ¡Es perfecto para mis necesidades! Si tienes alguna pregunta o comentario, no seas tímido. No estoy seguro de que sea la mejor manera de hacerlo, ¡pero estoy contento con eso!

Tenga en cuenta que el orden de la ruta es importante y también, si no pone el valor predeterminado y está en una página donde url2 = algo (sitio/sección/página) ¿entonces su enlace apunta al sitio/nueva sección? Url2 = La página me llevó un tiempo descubrir por qué ese parámetro de url2 estaba allí, pero ahora está todo bien.

Cuestiones relacionadas