带有html帮助器的布尔值Hidden和HiddenFor

时间:2010-03-08 09:45:53

标签: asp.net-mvc html-helper html.hiddenfor

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

<%= 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 个答案:

答案 0 :(得分:14)

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

2)不要使用此助手,请使用

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

答案 1 :(得分:1)

回答here问题是HTML帮助程序默认使用已发布的值(如果可用),然后引用模型。就我个人而言,我并不认为这会产生一大堆意义,现在想知道在整个平台上有多少其他错误在等待。

无论如何,上述答案中公布的解决方案将解决问题,只需在从控制器返回之前添加此行:

ModelState.Remove("TheBool")

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

答案 2 :(得分:0)

这是剃刀中的一个例子:

html:
@Html.HiddenFor(x => Model.TheBool, new { @id = "hdnBool" })

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

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

答案 3 :(得分:0)

我有类似的东西,最终像这样绕过它。 情况是用户想要保存然后确认保存方案....

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

ModelSate.Remove("OperationConfirmed");

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

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