Html.BeginForm在提交时丢失routeValues

时间:2014-05-02 10:19:45

标签: asp.net asp.net-mvc razor html-form url-parameters

我有一个显示人员列表的页面。它可以按名字和姓氏排序。为了搜索人,我有以下剃刀形式:

@using (Html.BeginForm("Index", "Persons", new { sort = ViewBag.Sort }, FormMethod.Get))
{
    <p>
        Search: @Html.TextBox("search", ViewBag.Search as string)
        <input type="submit" value="Search" />
    </p>
}

ViewBag.SearchViewBag.Sort包含上次使用的searchsort routeValues。当我按照名字对人员列表进行排序时,表单会以HTML格式呈现:

<form action="/persons?sort=firstname" method="get">
    <p>
        Search: <input id="search" name="search" type="text" value="" />
        <input type="submit" value="Search" />
    </p>
</form>

按照预期,?sort=firstname包含在操作中。但是,当我按下提交按钮(搜索)时,sort参数将丢失。新网址只有?search=...。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

当你查看输出html时,你会得到这样的结果:

<form action="/persons/index?sort=asc" method="get">
    <p>
        <input type="text" name="search" />
        <input type="submit" value="Search" />
    </p>
</form>

这看起来完全合法,你会期望像追加帖子输入的查询这样的行为。但是这受到HTTP规范的限制。不会附加表单后期操作的查询字符串。这就是为什么您的查询参数不能在您的服务器端工作。但是,我希望Asp.net能够自动将表单的参数自动获取到隐藏字段中。

作为一个正确的解决方案,您必须在表单中输入输入,以便您可以使用隐藏字段来执行此操作:

@using (Html.BeginForm("Index", "Persons", FormMethod.Get))
{
   @Html.Hidden("sort",ViewBag.Sort)
   <p>
      Search: @Html.TextBox("search", ViewBag.Search as string)
      <input type="submit" value="Search" />
   </p>
}

答案 1 :(得分:5)

您需要在表单中的某处存储sort的值,以便将其作为提交的一部分包含在内。您可以尝试隐藏输入:

@using (Html.BeginForm("Index", "Persons"))
{
    <input type="hidden" id="sort" value="firstname" />
    <p>
        Search: @Html.TextBox("search", ViewBag.Search as string)
        <input type="submit" value="Search" />
    </p>
}

您可能需要调整检索sort值的方式,我将firstname作为示例,但是当您提交表单时,sort将包含在有效内容中,例如

[HttpPost]
public ActionResult Index(string sort, string search)
{
}