7

我注意到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 中的错误,有时会被修复?

4

1 回答 1

7

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

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

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

于 2009-10-27T15:11:02.520 回答