Html.BeginForm 使用 FormMethod.GET 丢失 routeValues

Posted

技术标签:

【中文标题】Html.BeginForm 使用 FormMethod.GET 丢失 routeValues【英文标题】:Html.BeginForm loses routeValues with FormMethod.GET 【发布时间】:2010-10-27 20:33:03 【问题描述】:

我注意到 html.BeginForm() 方法将提供的 routeValues 编码为 FORM 标签的 action 属性。这适用于 POST 方法。但如果方法是 GET,则操作 URL 中的所有参数都会被浏览器剥离(在 IE8 和 Firefox 3.0.7 上测试)。

例如视图中的这段代码

<%
    using (Html.BeginForm("TestAction", "TestController", new  test = 123 , 
        FormMethod.Get)) 
    
        Response.Write("<input type='submit'>");
    ;
%>

给出这样的 HTML

<form action="/TestController/TestAction?test=123" method="get">
    <input type='submit'>
</form>

但提交表单后,URL 变成 /TestController/TestAction 而不是 /TestController/TestAction?test=123(参数丢失)。

现在我使用一组 Html.Hidden() 调用而不是 routeValues 参数,但我感兴趣是否有其他解决方法?是否应该将其视为 MVC 中的错误,并在某个时候修复?

【问题讨论】:

你能澄清你的问题吗?您是否尝试使用 GET 而不是 POST 提交表单?能举个例子吗? 【参考方案1】:

如您所见,生成的 HTML 是“正确的”,并且具有您想要的语义,因此这不是服务器端问题,而是客户端问题。 在这种情况下,浏览器会从操作 URL 中剥离查询部分,而您希望它附加到查询中。如果您阅读规范,则该操作不应该包含查询(它是 URI,而不是 URL),因此实际上您遇到了 HTTP 规范的“限制”。

您将被定向到没有任何查询的裸 url,因为在您拥有的 HTML 中没有任何可提交的内容。尝试为提交字段指定名称和值,或添加隐藏字段,您将看到参数在查询中传输。

在这种情况下,您绝对应该使用隐藏字段。

【讨论】:

有趣的是,为什么 ASP.NET MVC HTML 帮助程序 BeginForm() 在选择 GET 方法时不会自己呈现隐藏字段? 或者,创建一个特定的路由定义,以便将test 的值添加为路由段而不是查询字符串,在这种情况下您不需要隐藏输入

以上是关于Html.BeginForm 使用 FormMethod.GET 丢失 routeValues的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Html.Listboxfor 和 Html.Beginform

使用Html.BeginForm来提交表单

Html.BeginForm 传递模型项值

使用 .trigger('submit') 时 Html.BeginForm 未提交

将 Html.BeginForm 与查询字符串一起使用

替换为 Html.BeginForm()