MVC3 WebGrid页面/排序问题与页面上其他地方的CheckBox

时间:2011-11-17 09:07:20

标签: asp.net-mvc-3 checkbox webgrid

我的页面上有一个复选框,按原样创建:

@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时执行此操作?

4 个答案:

答案 0 :(得分:3)

MVC在@Html.CheckBoxFor(x => x.MyBoolValue)上创建了两个输入。一个复选框和一个值为false的隐藏字段。

他(MVC;))确保即使您不选中复选框,该变量也存在。 因此,如果您选中此框,则变量值为true,false,如果不是,则为false

这样做:

<input type="CheckBox" name="MyBoolValue" value="@Model.MyBoolValue"/>

或创建一个处理它的自定义模型绑定器。

ASP.NET MVC Custom Model Binding

答案 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);