【问题标题】:How can a Razor DropDownList GET a pretty URLRazor DropDownList 如何获取漂亮的 URL
【发布时间】:2013-03-28 15:06:31
【问题描述】:

我希望在下面的示例代码中提交到 GET /Product/Category/Id,其中 Id 值是选定的下拉列表 ID。但相反,我得到了/Product/Category?Id=Id,虽然它工作得很好,但看起来不像一个好的 URL

@using (Html.BeginForm("Category", "Product", FormMethod.Get))
{
<div class="category-search">
    <label for="CategoryList">Filter by Category</label>
    @Html.DropDownList("Id", (IEnumerable<SelectListItem>)ViewBag.CategoryList)
    <input type="submit" value="Filter" />
</div>   
}

我需要做些什么来保留漂亮的网址

编辑
我的 Global.asax.cs 只映射了以下路线

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        // Parameter defaults
);

在我的控制器中,我将添加到 ViewBag (更喜欢使用 ViewModel,但它已经与 IPagedList 一起使用)

var categories = Session.QueryOver<Category>()
                        .OrderBy(c=>c.CategoryName).Asc
                        .List();
ViewBag.CategoryList = new SelectList(categories, "CategoryName", "CategoryName");

我意识到使用CategoryName 作为下拉列表中的 id 和标签有点……奇怪,但我使用的是 ID 的 GUID,这使得 URL 很糟糕。这是能够“破解” URL 有效的唯一情况,即我很高兴用户可以根据需要在 URL 中键入要过滤的类别,而不是在下拉列表中查找它

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-routing


    【解决方案1】:

    我怀疑您是否能够在不捕获 Javascript 中提交的表单、抑制默认操作、提取信息、构建新操作字符串并将表单提交到该新操作字符串的情况下做您想做的事情。

    问题在于您提交的是表单值,而不是路由部分 - 表单中的 id 与路由部分中的 id 完全不同。当您使用FormMethod.Get 时,表单变量总是会以 GET 或 Query 字符串的形式发送到服务器。

    请务必注意,控制表单值如何提交回的是浏览器,而不是服务器端 MVC 代码。

    【讨论】:

    • 好的,所以如果我想要漂亮的 URL,我可以去掉下拉列表,而是在页面上放置 &lt;ul&gt;,根据需要设置它们的 ActionLink
    【解决方案2】:

    我假设您正在尝试连接到默认路由,这意味着您需要在 Id 中使用小写的 i 来匹配它。将其更改为id,它应该可以工作。

    这是默认路由:

    RouteTable.Routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    

    【讨论】:

    • 我正在尝试连接到默认路由,但是将 Id 更改为 id 并没有给我提供漂亮的 URL,我得到 /Product/Category?id=Necklace 而不是 /Product/Category/Necklace
    • @SimonMartin 嗯,很奇怪,你还有其他路线吗?可以发一下吗?
    • 我只是使用开箱即用的默认路由
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2017-07-19
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多