ASP.NET MVC 中可能出现表单值被替换的错误

2024-01-19

我似乎在使用 ASP.NET MVC 时遇到问题,因为如果我在一个页面上有多个表单,每个表单都使用相同的名称,但类型不同(单选/隐藏/等),那么,当第一个表单帖子(例如,我选择“日期”单选按钮),如果重新呈现表单(例如作为结果页面的一部分),我似乎遇到其他表单上 SearchType 的隐藏值的问题更改为最后一个单选按钮值(在本例中为 SearchType.Name)。

以下是用于减少目的的示例表格。

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.RadioButton("SearchType", SearchType.Date, true) %>
  <%= Html.RadioButton("SearchType", SearchType.Name) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.Hidden("SearchType", SearchType.Colour) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.Hidden("SearchType", SearchType.Reference) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

结果页面源(这将是结果页面的一部分)

<form action="/Search/Search" method="post">
  <input type="radio" name="SearchType" value="Date" />
  <input type="radio" name="SearchType" value="Name" />
  <input type="submit" name="submitForm" value="Submit" />
</form>

<form action="/Search/Search" method="post">
  <input type="hidden" name="SearchType" value="Name" /> <!-- Should be Colour -->
  <input type="submit" name="submitForm" value="Submit" />
</form>

<form action="/Search/Search" method="post">
  <input type="hidden" name="SearchType" value="Name" /> <!-- Should be Reference -->
  <input type="submit" name="submitForm" value="Submit" />
</form>

请问其他有 RC1 的人可以证实这一点吗?

也许是因为我正在使用枚举。我不知道。我应该补充一点,我可以通过对隐藏字段使用“手动”输入 () 标签来规避此问题,但如果我使用 MVC 标签 (),.NET MVC 会替换它们每次。

非常感谢。

Update:

我今天又看到这个bug了。当您返回发布的页面并使用 MVC 设置隐藏表单标签和 Html 帮助器时,这似乎会产生影响。我已经联系过菲尔·哈克 http://haacked.com关于这一点,因为我不知道还能转向哪里,而且我不认为这应该是大卫指定的预期行为。


是的,这种行为目前是设计使然。即使您显式设置值,如果您回发到同一 URL,我们也会查看模型状态并使用那里的值。一般来说,这使我们能够显示您在回发时提交的值,而不是原始值。

有两种可能的解决方案:

解决方案1

为每个字段使用唯一的名称。请注意,默认情况下我们使用您指定的名称作为 HTML 元素的 id。多个元素具有相同的 id 是无效的 HTML。因此,使用唯一的名称是一个很好的做法。

解决方案2

不要使用隐藏助手。看来你真的不需要它。相反,你可以这样做:

<input type="hidden" name="the-name" 
  value="<%= Html.AttributeEncode(Model.Value) %>" />

当然,当我更多地考虑这一点时,根据回发更改值对于文本框来说是有意义的,但对于隐藏输入来说意义不大。我们无法在 v1.0 中更改此设置,但我会在 v2 中考虑它。但我们需要仔细思考这种变化的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 中可能出现表单值被替换的错误 的相关文章

随机推荐