我想知道在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
属性。
最好的方法是什么?
最佳答案
我看了一下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 = "" });
}
现在我的 Controller :
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 =某物(站点/部分/页面)的页面中,那么您所有的链接都将指向site/newsection?url2 = page用了我花点时间弄清楚为什么那里有url2参数,但是现在可以了!
关于c# - .Net MVC中的URL重写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2375256/