路由器链接不会调用Actionresult。 Formcollection的罪魁祸首?

时间:2010-02-24 22:30:29

标签: asp.net-mvc pagination formcollection routelink

我对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,只是传递字符串等。

1 个答案:

答案 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。这将导致用户的奇怪行为;例如,当他们按下刷新时,他们的浏览器会警告他们重新提交表格。

你应该:

  1. 使用GET而不是POST搜索结果。
  2. 重定向而不是返回视图。
  3. 我亲自挑选第一个。