我的頁面上有一個搜索表單,我想使用GET提交表單。搜索形式如下:MVC路由問題
@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」)調用)
感謝Darin。我很驚訝,他的框架不支持,但我已經與你提供的JavaScript方法一起工作。作爲一個便箋,我想使用GET,因爲如果我要從某個頁面進行搜索,可以說'/ Search/All/Region/20110101/20110201',然後再次從該頁面進行搜索,POST請求會仍然有舊的URL - 它不會反映新的日期 – Beno 2011-03-26 12:44:20
@quagland,這不是ASP.NET MVC框架的限制。 HTML規範是如何定義的,瀏覽器只是遵循這個規範。 – 2011-03-26 12:49:03
沒錯,現在我有更多的想法了。謝謝你的幫助 – Beno 2011-03-26 12:55:27