我的页面上有一个复选框,创建如下:
@Html.CheckBoxFor(x => x.MyBoolValue)
下面我有一个WebGrid排序和分页,但在这样做我得到一个系统。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上,我使用Contains("true")处理查询字符串值,但是当WebGrid刷新时,我该如何做到这一点?
MVC在@Html.CheckBoxFor(x => x.MyBoolValue)
上创建两个输入。一个复选框和一个值为false
的隐藏字段。
He (MVC;))这样做确保,即使你不选中复选框,变量也存在。因此,如果您勾选该框,则变量值为true,false
,否则为false
。
这样做:
<input type="CheckBox" name="MyBoolValue" value="@Model.MyBoolValue"/>
或者创建一个定制的模型绑定器来处理它。
ASP。. MVC自定义模型绑定
如果您想要维护所有标准的验证器或绑定器功能,那么隐藏字段会给您带来麻烦。你可以这样写:
<input type="CheckBox"@(Model.BoolProperty ? " checked="checked"" : string.Empty) name="BoolProperty" value="true"/>
我发现从ModelState中删除这个值解决了这个问题,并且似乎没有引起任何副作用—如果我错过了什么,也许有人可以指出来?
在控制器中添加
ModelState.Remove("MyBoolValue");
这意味着
@Html.CheckBoxFor(x => x.MyBoolValue)
将退回到使用模型值,除非我错了?
问题是操作参数的名称:
public ActionResult Product(ProductModel model);
例如,以下命令将解决您的问题:
public ActionResult Product(ProductModel request);