代码之家  ›  专栏  ›  技术社区  ›  VinnyG

在.net mvc中重写url

  •  12
  • VinnyG  · 技术社区  · 15 年前

    我想知道在mvc中处理url的最佳方法是什么。例如,在我的应用程序中,我有一个 PageController 可以链接到 /website/Page/Index/3 /website/Page/home . 菜单是基于传入的URL动态地用html.actionLink()和t4mvc构建的,所以我没有任何硬编码。

    现在我想做的是把我的url和链接指向更友好的seo,比如, /website/our-company/ 它也可以有孩子 /website/our-company/location/ /website/our-company/employees/ . 你明白了。

    我所有的页面都保存在bd中 FriendlyUrl parentId 对象中的属性。

    最好的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Lauren Van Sloun Sebastian Inones    7 年前

    我看了一眼 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参数在那里,但现在一切都好了!