MVC路由问题

时间:2011-03-26 01:26:40

标签: asp.net-mvc-3

我的页面上有一个搜索表单,我想使用GET提交表单。搜索表单如下所示:

    @using (Html.BeginForm("List", "Search", FormMethod.Get))
    {
        @Html.HiddenFor(model => model.CategoryName)
        @Html.HiddenFor(model => model.RegionName)

        <table class="plain">
            <tr>
                <td>From</td>
                <td>@Html.TextBoxFor(model => model.FromDate)</td>
            </tr>
            <tr>
                <td>To</td>
                <td>@Html.TextBoxFor(model => model.ToDate)</td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" id="Search" value="Search" />
                </td>
            </tr>

        </table>
    }  

使用这样的视图模型:

public class SideNavModel
{
    public string CategoryName { get; set; }
    public string RegionName { get; set; }
    public string FromDate { get; set; }
    public string ToDate { get; set; }
}

我的路线设置如下:

    routes.MapRoute(
        "Search2",
        "Search/{CategoryName}/{RegionName}/{FromDate}/{ToDate}",
        new { controller = "Search", action = "List", CategoryName = "All", RegionName = "All", FromDate = "", ToDate = "" });

    routes.MapRoute(
        "Search1",
        "Search/{CategoryName}/{RegionName}",
        new { controller = "Search", action = "List", CategoryName = "All", RegionName = "All" });

因此,当我实际进行搜索时,URL会发送到:

/Search?CategoryName=All&RegionName=SomeRegion&FromDate=20110301&ToDate=20110317

我真正想要的地方:

/Search/All/SomeRegion/20110301/20110317

我不确定它是否重要但是设置方式,搜索需要出现在每个页面上。所以,在_layout.cshtml'主页'中,我有这个:

@{Html.RenderAction("LoadNavigationSide");}

并在BaseController中,这个:

public PartialViewResult LoadNavigationSide(SideNavModel model)
{
    // other code
    // ...
    return PartialView("NavigationSide", model);
}

(它需要像这样,因为它只是返回模型 - 所以它不能是一个简单的@ Html.Partial(“NavigationSide”)调用)

2 个答案:

答案 0 :(得分:3)

如果在表单上使用method="GET",则HTML规范会声明用户代理应向action属性中使用的url发送GET请求,并将值附加为查询字符串参数。

如果在表单上使用method="POST",则HTML规范会声明用户代理应向action属性发送POST请求,并在POST请求正文中写入表单字段的值。

结论:使用纯HTML可以实现您想要实现的目标。

实现此目的的一种方法是使用javascript并订阅表单的onsubmit事件,构建请求URL并在取消默认行为后手动重定向到它。 jQuery示例:

$('form').submit(function() {
    var url = this.action + '/' + $('#FromDate').val() + '/' + $('#ToDate').val();
    window.location.href = url;
    return false;
});

但我个人会坚持使用POST动词。

答案 1 :(得分:0)

您的解决方案中是否有SearchController?听起来您可能会路由到默认路由,如果您在自定义搜索路由之前声明默认路由,这是有意义的。

此外,Haack's Route Debugger是测试路线的绝佳工具。