这可能很简单,但一直让我疯了。我已经搜遍了这一点,发现有人提到它但没有提供解决方案。
我有一个简单的viewmodel,它有一个没有数据注释的布尔属性,其他属性可以,但这些不会影响问题。
Public Property AcceptSurvey As Boolean
我有一个强类型的视图,这个模型适用于服务器验证(即所有其他验证工作正常,而AcceptSurvey是可选的)。
<%: Html.CheckBoxFor(Function(x) x.AcceptSurvey)%>
当我启用客户端验证时,在提交表单时(未选中AcceptSurvey),我收到消息“AcceptSurvey字段是必需的。”。我认为这是因为验证只有在选中复选框时才会看到一个值(true)。我意识到CheckBoxFor帮助器呈现一个隐藏字段(同名属性和值false),并认为这是为了解决这个问题。
如果我使属性可以为空,我不能使用CheckBoxFor,我可以使用EditorFor但这会呈现为具有三个属性的下拉列表(不是我想要的),并且客户端验证工作正常。
我是傻瓜吗? BTW我在客户端使用MVC JQuery。
答案 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" %>