.Net MVC中的URL重写

Vin*_*nyG 12 c# asp.net-mvc url-rewriting

我想知道在MVC中处理URL的最佳方法是什么.例如,在我的应用程序中,我有一个PageController可以链接到/website/Page/Index/3/website/Page/home.菜单是使用Html.ActionLink()和T4MVC动态构建的,基于传入的URL,因此我没有任何硬编码.

现在我想要做的是将我的网址和链接指向更友好的SEO,例如,/website/our-company/它也可以让孩子喜欢/website/our-company/location//website/our-company/employees/.你明白了.

我的所有页面都保存在BD和我FriendlyUrlparentId我对象属性.

这样做的最佳方法是什么?

Vin*_*nyG 6

我看了一下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 = "" });
}
Run Code Online (Sandbox Code Playgroud)

而现在我的控制器:

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);
}
Run Code Online (Sandbox Code Playgroud)

以下是我渲染链接的方式(我的菜单示例):

<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>
Run Code Online (Sandbox Code Playgroud)

完美适合我的需求!如果您有任何疑问或意见,请不要害羞!我不确定这是最好的方法,但我很满意!

请注意,路由顺序很重要,如果您没有设置默认值并且在url2 =某个页面(site/section/page),那么您的所有链接都将指向site/newsection?url2 = page took我有一段时间弄清楚为什么url2 param在那里,但现在它没事!