以 GUID 作为 id 的 MVC 5 路由,隐藏在 URL 中
本文关键字:隐藏 URL 路由 作为 GUID id MVC | 更新日期: 2023-09-27 18:31:03
我在项目 MVC 8.1(.NET 4.5 而不是 4.5.1)下使用 VS2013 预览版,过去几个小时我一直在研究尝试各种东西,似乎我只是不明白我错过了什么。
我正在通过构建论坛来开展一个学校项目,我希望 URL 是分层的,即 localhost:1234/Forum/Science/Physics/String%20Theory
.
这是路由配置:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{action}/{*title}",
defaults: new { controller = "Home", action = "Index", title = UrlParameter.Optional }
);
}
控制器:
public ActionResult Index()
{
return View(db.Categories.Where(x => x.ParentId == null).ToList());
}
public ActionResult Forum(string parentId)
{
return View("Index", db.Categories.Where(x => x.ParentId == parentId));
}
并查看(这是索引页):
@foreach (var item in Model)
{
<div class="CatLevel0">
<h2>@Ajax.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = item.Title }, new AjaxOptions() { HttpMethod = "POST" })</h2>
<h4>@Html.DisplayFor(modelItem => item.Description)</h4>
</div>
}
问题就在这里。上面的链接(例如"科学")指向: "http://localhost:1234/Forum/Science?parentId=b8bd9ded-7284-462d-b0cc-d8ce09717b8a"
,在被转发到"科学"并被重定向到"社会科学"后的第二级,我得到: "http://localhost:1234/Forum/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3"
.
因此,我不仅在查询字符串中获得了冗余的GUID(我不想要!),而且还丢失了"~/Forum/Science/Social%20Sciences"中的前身"Science";
在其他一些SO问题中,有人指出Ajax.ActionLink需要jquery不显眼的ajax,从Chrome开发人员工具中的网络选项卡来看,它可以正确呈现。
更新:我设法使用以下方法解决了@TimothyWalters提到的问题:
控制器:
public ActionResult Forum(string parentId, string title)
{
TempData["fullTitle"] = title + "/";
return View("Index", db.Categories.Where(x => x.ParentId == parentId));
}
视图:
@foreach (var item in Model)
{
<div class="CatLevel0">
@*<h2>@Html.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = item.Title })</h2>*@
<h2>@Ajax.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = TempData["fullTitle"] + item.Title }, new AjaxOptions() { HttpMethod = "POST" })</h2>
<h4>@Html.DisplayFor(modelItem => item.Description)</h4>
</div>
}
所以现在我有http://localhost:5465/Forum/Science/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3
,这留下了查询字符串中的 GUID 问题需要处理。
更新2:呃 - 现在我得到这个:http://localhost:5465/Forum/Science/Social%20Sciences/Science/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3
.
如果不希望查询字符串中包含 GUID,请停止将其放在那里。如果你不打算在那里拥有它,你将需要一些可靠的方法来从你的路径中提取意义。
你显式告诉它将 GUID 与视图中的代码放在查询字符串中,其中parentId
包含在对ActionLink()
的调用中。删除该参数,您将不再有 GUID。
若要从路径中提取含义,需要一种方法将"科学/物理/弦理论"转换为之前通过 GUID 找到的父项的"弦理论"子项。
var parts = title.Split('/');
var categories = db.Categories
.Where(c => parts.Contains(c.Title))
.ToList();
// start at the root
var category = categories.Where(c => c.ParentId == null && c.Title == parts[0]);
// look for anything past the root level (starting at index 1 not 0)
for (var i = 1; i < parts.Length; i++)
{
category = categories.Where(c => c.ParentId == category.Id && c.Title == parts[i]);
}
// use category to create new view
return View(category);