我对MVC很新。我正在尝试设置搜索数据库并返回结果的搜索页面。搜索框位于我的视图中的Html.BeginForm中,如下所示:
<% using (Html.BeginForm())
{ %>
<%= Html.TextBox("searchBox", null, new { @id = "searchBox" })%>
<div id="searchButtonsDiv">
<input type="submit" value="Search" />
</div>
<% } %>
//Results are returned in a ul and orgainized
//Pagination below
<% if (Model.HasPreviousPage)
{ %>
<%= Html.RouteLink("Previous", "SearchResults", new { page = (Model.PageIndex - 1) })%>
<% } %>
<% if (Model.HasNextPage)
{ %>
<%= Html.RouteLink("Next", "SearchResults", new { formCollection = "", page = (Model.PageIndex + 1) })%>
<% } %>
我正在使用FormCollection传递给我的控制器,如下所示:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection formCollection, int? page)
{
var searchString = formCollection["searchBox"];
var results = resultsRepository.GetResults();
var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);
return View(paginatedResults);
}
到目前为止一切顺利。当我输入一个单词并按下提交按钮时,将调用索引并且数据库会相应地返回。 ul会被结果填充,当有超过pageSize结果(在我的情况下为10)时,将显示Next链接。
单击“下一步”时,将加载默认页面。没有分页或类似的东西。我很确定这与我的Index ActionResult有一个FormCollection作为参数的事实有关。我以为我读到的地方只能处理字符串/整数?这是MapRoute:
routes.MapRoute(
"SearchResults",
"Drivers/Index/{formCollection}/{page}",
new { controller = "Drivers", action = "Index", formCollection = "", page = "" }
);
我完全错过了什么或有办法处理这个问题吗?我知道我可以使用jquery / ajax发送搜索列表框中包含的字符串,但我不想这样做,因为后来我计划添加复选框作为过滤搜索等的方法。
我尝试了几种不同的方法来设置formCollection的值,包括创建一个新的FormCollection,它添加了searchBox,只是传递字符串等。
答案 0 :(得分:1)
操作中的FormCollection
参数不是问题。这将永远有效。
然而, 绝对不会 属于您的路线!摆脱它,你可能会解决问题。表单元素不会进入URI,只有URI中的内容应该在路径中。
然而,这并不是我写这个动作签名的方式。我建议:[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string searchBox, int? page)
{
var results = resultsRepository.GetResults();
var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);
return View(paginatedResults);
}
最后:在这种情况下,您不应该从View
返回POST
。这将导致用户的奇怪行为;例如,当他们按下刷新时,他们的浏览器会警告他们重新提交表格。
你应该:
GET
而不是POST
搜索结果。我亲自挑选第一个。