MVC 2 Html CheckBox客户端验证

时间:2010-09-06 14:31:07

标签: jquery validation asp.net-mvc-2 checkbox

这可能很简单,但一直让我疯了。我已经搜遍了这一点,发现有人提到它但没有提供解决方案。

我有一个简单的viewmodel,它有一个没有数据注释的布尔属性,其他属性可以,但这些不会影响问题。

Public Property AcceptSurvey As Boolean

我有一个强类型的视图,这个模型适用于服务器验证(即所有其他验证工作正常,而AcceptSurvey是可选的)。

<%: Html.CheckBoxFor(Function(x) x.AcceptSurvey)%>

当我启用客户端验证时,在提交表单时(未选中AcceptSurvey),我收到消息“AcceptSurvey字段是必需的。”。我认为这是因为验证只有在选中复选框时才会看到一个值(true)。我意识到CheckBoxFor帮助器呈现一个隐藏字段(同名属性和值false),并认为这是为了解决这个问题。

如果我使属性可以为空,我不能使用CheckBoxFor,我可以使用EditorFor但这会呈现为具有三个属性的下拉列表(不是我想要的),并且客户端验证工作正常。

我是傻瓜吗? BTW我在客户端使用MVC JQuery。

1 个答案:

答案 0 :(得分:1)

我不知道答案有多好,但它对我有用。

我正在使用MVC 2.0,因此我创建了共享显示器和放大器。布尔数据类型的编辑器模板。我将布尔值显示为两个选项下拉菜单,而不是复选框。

另一个选择是采用相同的方法,但在编辑器模板中,创建一个隐藏字段并设置复选框事件/重置隐藏字段值。我从这开始,但用户更喜欢下拉式方法。

/Views/Shared/EditorTemplates/Boolean.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Boolean>" %>
<%
    var items = new List<SelectListItem>();
    items.Add(new SelectListItem(){
            Text = @"No",
            Value = @"false",
            Selected = (Model == false)
    });
    items.Add(new SelectListItem(){
            Text = @"Yes",
            Value = @"true",
            Selected = (Model == true)
    });
%>
<%: Html.DropDownList("", items) %>

/Views/Shared/EditorTemplates/Boolean.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Boolean>" %>
<%: Model ? @"Yes" : @"No" %>