布尔值在HTML Helper中的Hidden和HiddenFor方法中的应用

17

这是怎么回事?viewmodel变量是一个bool类型,值为true。

<%= Html.HiddenFor(m => m.TheBool) %>
<%= Html.Hidden("IsTimeExpanded",Model.TheBool) %>
<input type="hidden" value="<%=Model.TheBool%>" name="TheBool" id="TheBool">

结果为:

<input id="TheBool" name="TheBool" value="False" type="hidden">
<input id="TheBool" name="TheBool" value="False" type="hidden">
<input value="True" name="TheBool" id="TheBool" type="hidden">

我做错了什么?为什么这些辅助函数不能按预期工作?


4
答案在 https://dev59.com/zm445IYBdhLWcg3wws0u。 - user2463729
这个评论应该是正确的答案 - Helpers 首先使用 POST 值。因此,如果您在 postback 上更新 TheBool,然后显示模型而不进行重定向/获取,则可能会显示错误的值。 - Jason Beck
4个回答

15

1)使用不同(唯一的)id

2)不要使用此辅助工具,使用

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

ID仅为示例,由助手自动设置,与结果无关。问题是:为什么助手不能按预期工作? - Martin
这是一个应该向微软提出的问题,许多人都遇到了奇怪的行为(我发现其他人也有同样的问题请求)。我试图帮助解决或避免它。我不在微软工作。 :) 我没有得到你的任何感谢,所以我不明白为什么你对我的帮助如此批评。 - garik
我感谢你想要帮助我,只是你并没有帮到我。实际上,你提供的信息都已经在问题中了,没有任何相关的信息。请把你提到的问题链接给我。 - Martin
3
看起来这是您的情况:http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=5089 - garik
嗯,现在这个真是帮了大忙。 :) - Martin
1
您仍然可以使用助手并通过 htmlAttributes 参数传递 ID - Html.Hidden("IsTimeExpanded", Model.TheBool, new { id="TheBool_1216786" }) - Simon_Weaver

3

如同这里所回答的那样,问题在于HTML助手默认使用已提交的值(如果有)然后引用模型。个人认为这并不太合理,现在我想知道我们平台中还有多少其他的错误。

无论如何,在从控制器返回前添加以下代码将解决问题:

ModelState.Remove("TheBool")

是的,这有点糟糕,因为你只能使用字符串引用...但它确实有效。


是的 - 这个可以工作,但我知道在未来几年当我看代码时,我会想“为什么我要这样做。” - AntDC
1
我非常赞同,并全心全意地推荐在所谓的“修复”周围进行自由评论。然而,这是框架的不足之处,如果没有这样的补救措施是无法避免的;也就是说,在尝试自动化此过程时覆盖OnActionExecute(或某些类似设备)只会导致更多意外行为和问题。 - Paul Carroll

0

我有类似的问题,最终通过以下方式解决:

用户想要保存并确认保存的场景...

我选择使用下面的解决方案而不是...

ModelSate.Remove("OperationConfirmed");

(这个)确实有效,因为我感觉它更直观...

@{
  string btnSaveCaption = "Save Changes";
  if (Model.OperationConfirmed)
  {
    btnSaveCaption = "Confirm Save Changes";
    @Html.Hidden("OperationConfirmed", true)
  }          
} 

0
这是一个在Razor中的例子。
html:
@Html.HiddenFor(Model => Model.TheBool, new { @id = "hdnBool" })

javascript:
alert($('#hdnBool').val());

model:
public class MyModel()
{
  public bool TheBool{ get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接