我有一个显示人员列表的页面。它可以按名字和姓氏排序。为了搜索人,我有以下剃刀形式:
@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.Search
和ViewBag.Sort
包含上次使用的search
和sort
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=...
。我该如何解决这个问题?
答案 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)
{
}