【问题标题】:Html.BeginForm loses routeValues on submitHtml.BeginForm 在提交时丢失 routeValues
【发布时间】:2014-06-18 23:59:53
【问题描述】:

我有一个显示人员列表的页面。它可以按名字和姓氏排序。为了搜索人,我有以下 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>
}

ViewBag.SearchViewBag.Sort 包含最后使用的 searchsort 路由值。当我按名字对人员列表进行排序时,表单会以 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=...。我该如何解决这个问题?

【问题讨论】:

    标签: asp.net asp.net-mvc razor forms url-parameters


    【解决方案1】:

    当您查看输出的 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>
    }
    

    【讨论】:

    • 这似乎是在 Razor 中执行此操作的最佳方式。谢谢。
    【解决方案2】:

    您需要将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>
    }
    

    您可能需要调整如何检索排序值,我以firstname 为例,但是当您提交表单时,sort 将包含在有效负载中,例如

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

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2013-07-02
      • 2020-09-16
      相关资源
      最近更新 更多