我的页面上有一个复选框,按原样创建:
@Html.CheckBoxFor(x => x.MyBoolValue)
下面我有一个带有排序和分页的WebGrid,但是在这样做时我得到一个System.InvalidOperationException:
The parameter conversion from type 'System.String' to type 'System.Boolean' failed. See the inner exception for more information.
内部例外是:
{"true,false is not a valid value for Boolean."}
我知道这是由于CheckBox和底层隐藏值的绑定造成的。在页面GET我使用包含(“true”)查询字符串值处理此问题,但是如何在刷新WebGrid时执行此操作?
答案 0 :(得分:3)
MVC在@Html.CheckBoxFor(x => x.MyBoolValue)
上创建了两个输入。一个复选框和一个值为false
的隐藏字段。
他(MVC;))确保即使您不选中复选框,该变量也存在。
因此,如果您选中此框,则变量值为true,false
,如果不是,则为false
。
这样做:
<input type="CheckBox" name="MyBoolValue" value="@Model.MyBoolValue"/>
或创建一个处理它的自定义模型绑定器。
答案 1 :(得分:1)
如果您想维护所有标准验证器或绑定器功能,隐藏字段会让您感到烦恼。你可以用这个:
<input type="CheckBox"@(Model.BoolProperty ? " checked=\"checked\"" : string.Empty) name="BoolProperty" value="true"/>
答案 2 :(得分:0)
我发现从ModelState中删除值可以解决这个问题,并且似乎没有引起任何副作用 - 也许有人可能会指出我是否错过了什么?
在我的控制器中,我只需添加
ModelState.Remove("MyBoolValue");
这意味着
@Html.CheckBoxFor(x => x.MyBoolValue)
除非我弄错了,否则会回退到使用Model值吗?
答案 3 :(得分:0)
问题是您的操作参数的名称:
public ActionResult Product(ProductModel model);
例如,以下内容将解决您的问题:
public ActionResult Product(ProductModel request);