Asp.net mvc 3 MVC路由问题

Asp.net mvc 3 MVC路由问题,asp.net-mvc-3,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">

我的页面上有一个搜索表单,我想使用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" });
我有这样设置的路线:

    @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”)调用)

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

此外,它还是测试路由的一个很好的工具。

如果您在表单上使用
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动词。

是的,我有一个SearchController。SearchController正在接收参数。我已经看过路由调试器(非常方便)。如果我有一个像:/Search/All/SomeRegion这样的url,我希望它能通过earch/{CategoryName}/{RegionName}路由。目前,它正在通过搜索/{CategoryName}/{RegionName}/{FromDate}/{ToDate}获取。有没有办法做到这一点?请尝试删除指定默认参数的零件。这似乎是他们能够很好地匹配的唯一原因,这已经解决了我所遇到的大多数问题。现在,整个功能正常运行,但搜索问题仍然存在-表单上的GET请求仍然返回一个url,如:
/search/?CategoryName=All&RegionName=SomeRegion&FromDate=20110301&ToDate=20110327
如果我使用POST,也可以,但这会导致“假”url。我需要告诉搜索表使用什么路线吗?谢谢Darin。我很惊讶框架不支持his,但我已经用您提供的javascript方法实现了它。作为补充说明,我想使用GET,因为如果我要从某个页面进行搜索,比如说“/search/All/Region/20110101/20110201”,然后再次从该页面进行搜索,POST请求仍将具有旧URL-它不会反映新URLdates@quagland,这不是ASP.NET MVC框架的限制。这就是HTML规范是如何定义的,浏览器只是简单地遵循这个规范。对了,现在我仔细考虑一下,这是有意义的。谢谢你的帮助