Html.BeginForm在提交时丢失routeValues

Rud*_*dey 2 forms asp.net asp.net-mvc url-parameters razor

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

@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>
}
Run Code Online (Sandbox Code Playgroud)

ViewBag.SearchViewBag.Sort包含最后使用的searchsortrouteValues.当我按照名字对人员列表进行排序时,表单会以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>
Run Code Online (Sandbox Code Playgroud)

按照预期,?sort=firstname包含在行动中.但是,当我按下提交按钮(搜索)时,sort参数将丢失.新网址只有?search=....我怎样才能解决这个问题?

Vol*_*yır 8

当你看输出html时你会得到这样的东西:

<form action="/persons/index?sort=asc" method="get">
    <p>
        <input type="text" name="search" />
        <input type="submit" value="Search" />
    </p>
</form>
Run Code Online (Sandbox Code Playgroud)

这似乎是完全合法的,你会期望像追加帖子输入的查询这样的行为.但是这受到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>
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*ans 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>
}
Run Code Online (Sandbox Code Playgroud)

您可能需要调整如何检索sort的值,我firstname举一个示例,但是当您提交表单时,sort将包含在有效负载中,例如

[HttpPost]
public ActionResult Index(string sort, string search)
{
}
Run Code Online (Sandbox Code Playgroud)