Перезапись URL в.Net MVC

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

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

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

То, что, является лучшим способом сделать его?

12
задан Jason 24 September 2012 в 15:59
поделиться

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 = something (site / section / page), тогда вся ваша ссылка будет указывать на site / newsection? Url2 = page мне потребовалось время, чтобы понять, почему там был этот параметр url2, но теперь все в порядке!

6
ответ дан 2 December 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: