0

我对 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 作为参数这一事实有关。我以为我在某个地方读到只能处理字符串/整数?这是地图路线:

        routes.MapRoute(
            "SearchResults",
            "Drivers/Index/{formCollection}/{page}",
            new { controller = "Drivers", action = "Index", formCollection = "", page = "" }
        );

我完全错过了什么还是有办法处理这个?我知道我可以只使用 jquery/ajax 来发送包含在搜索列表框中的字符串,但我不想这样做,因为稍后我计划添加复选框作为过滤搜索等的手段。

我尝试了几种不同的方法来设置 formCollection 的值,包括创建一个添加 searchBox 的新 FormCollection,以及只传递字符串等。

4

1 回答 1

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从 a返回 a。POST这会给用户带来奇怪的行为;例如,当他们按下刷新时,他们的浏览器会警告他们重新提交表单。

您应该:

  1. 使用 a GET,而不是 aPOST搜索结果。
  2. 重定向而不是返回视图。

我个人会选择第一个。

于 2010-02-25T14:28:01.257 回答