Zastanawiam się, jaki jest najlepszy sposób obsługi adresu URL w MVC. Na przykład w mojej aplikacji mam PageController
można połączyć z /website/Page/Index/3
lub /website/Page/home
. Menu jest budowane dynamicznie z Html.ActionLink () i T4MVC w oparciu o przychodzące adresy URL, więc nie mam nic na sztywno.
Teraz chcę wskazać mój adres URL i linki do czegoś bardziej przyjaznego SEO, na przykład /website/our-company/
i może również mieć dzieci takie jak /website/our-company/location/
lub /website/our-company/employees/
. Masz pomysł.
Wszystkie moje strony są zapisywane na BD i mam FriendlyUrl
i parentId
właściwości w moim obiekcie.
Jaki jest najlepszy sposób na zrobienie tego?
Ok, przyjrzałem się http://www.asp.net/learn/mvc/tutorial-23-cs.aspx i mam to działa. Bardziej proste, niż sądziłem ...
Moje trasy:
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 = "" });
}
A teraz mój kontroler:
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);
}
A oto jak renderuję link (przykład z mojego menu):
<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>
Działa idealnie na moje potrzeby! Jeśli masz jakieś pytanie lub komentarze, nie wstydź się! Nie jestem pewien, czy to najlepszy sposób, ale jestem z tego zadowolony!
Zauważ, że kolejność na trasie jest ważna, a także, jeśli nie umieścisz wartości domyślnej i jesteś na stronie, gdzie url2 = coś (strona / sekcja / strona), wtedy wszystkie twoje linki wskażą stronę / nową sekcję? Url2 = strona zabrała mi jednocześnie, aby dowiedzieć się, dlaczego ten parametr url2 istnieje, ale teraz wszystko jest w porządku!