URL-адрес перезаписи в .Net MVC

Мне интересно, как лучше всего обрабатывать URL в MVC. Например, в моем приложении у меня есть PageController, который может ссылаться на /website/Page/Index/3 или /website/Page/home. Меню создается динамически с помощью Html.ActionLink() и T4MVC на основе входящих URL-адресов, поэтому я не имею ничего жесткого.

Теперь то, что я хочу сделать, это указать мой URL-адрес и ссылки на что-то более дружественное к SEO, например, /website/our-company/, и у него также могут быть такие дети, как /website/our-company/location/ или /website/our-company/employees/. Вы поняли.

Все мои страницы сохраняются в BD, и у меня есть объекты FriendlyUrl и parentId в моем объекте.

Каков наилучший способ сделать это?

Ответ 1

Хорошо, я взглянул на http://www.asp.net/learn/mvc/tutorial-23-cs.aspx, и я получил его работу. Проще, чем я...

Мои маршруты:

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

    }

И теперь мой контроллер:

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

И вот как я визуализую ссылку (например, мое меню):

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

Отлично работает для моих нужд! Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь! Я не уверен, что это лучший способ сделать это, но я доволен этим!

Обратите внимание, что порядок маршрутов важен, а также, если вы не поместили значение по умолчанию и находитесь на странице, где url2 = что-то (сайт/раздел/страница), то все ссылки youre указывают на сайт/новости? Url2 = page взял меня а выяснить, почему этот url2 param был, но теперь все в порядке!