Pytanie Przepisywanie adresów URL w .NET MVC


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?


12
2018-03-03 21:49


pochodzenie


Lepiej spójrz na: - Omówienie routingu ASP.NET MVC (C #) - Asad Butt
Teraz to mam, ale nie jestem do końca pewien, jak mogę zrobić to, co próbuję tutaj zrobić. Czy to możliwe, że mój HTML.ActionLink () przekieruje do / witryny / naszej firmy / lokalizacji / kiedy wskażę do MVC.Page.Index (12)? I jak powinna wyglądać moja trasa, ponieważ nie chcę "strony", czarownica jest kontrolerem, częścią mojego adresu URL? - VinnyG


Odpowiedzi:


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!


6
2018-03-04 21:03