2010-09-06 138 views
1

這可能很簡單,但一直在推動我的堅果。我已經搜遍了這個,發現有人提到它,但沒有提供解決方案。MVC 2 Html CheckBox客戶端驗證

我有一個簡單的viewmodel有一個布爾屬性沒有數據註釋上,其他屬性但這些不影響問題。

Public Property AcceptSurvey As Boolean 

我有一個強類型在此模型上正常工作與服務器驗證視圖(即所有其它的驗證工作正常和AcceptSurvey是可選的)。

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

當啓用客戶端驗證,上提交表單(AcceptSurvey未選中)我得到的消息「AcceptSurvey字段是必需的。」。我認爲這是因爲驗證時只會檢查複選框的值(真)。我意識到CheckBoxFor幫助器呈現一個隱藏的字段(同名屬性和值爲false),並認爲這是爲了解決這個問題。

如果我使屬性爲空,我不能使用CheckBoxFor,我可以使用EditorFor,但是這呈現爲具有三個屬性(不是我想要的)的dropdownlist,而客戶端驗證正常工作。

我是不是很愚蠢?順便說一句我在客戶端使用MVC JQuery。

回答

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" %>