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