以 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 作为 id 的 MVC 5 路由,隐藏在 URL 中

. .

如果不希望查询字符串中包含 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);