Razor DropDownList如何获得漂亮的URL

时间:2013-03-28 15:06:31

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

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

@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和标签有点奇怪......但是我正在使用GUID作为ID,这会产生一个糟糕的URL。这是能够“破解”URL有效的唯一情况,即我很高兴用户可以在URL中键入要过滤的类别,而不是在下拉列表中查找

2 个答案:

答案 0 :(得分:1)

我假设你试图挂钩到默认路线,这意味着你需要i中的小写Id来匹配它。将其更改为id,它应该可以正常工作。

这是默认路线:

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

答案 1 :(得分:1)

我怀疑如果不在Javascript中捕获表单提交,禁止默认操作,提取信息,构建新的操作字符串以及将表单提交给新的操作字符串,我都会怀疑你能做什么。< / p>

问题在于您提交的是表单值,而不是路由部分 - 表单中的ID与路径部分中的ID完全不同。当您使用FormMethod.Get时,表单变量将始终作为GET或查询字符串发送到服务器。

重要的是要注意它的浏览器控制表单值的提交方式,而不是服务器端的MVC代码。