2011-08-08 58 views
19

簡單的問題在這裏(我認爲)。使用數據註釋強制模型的布爾值爲真

我有一個表單,在用戶必須同意條款和條件的底部有一個複選框。如果用戶沒有選中該框,我想在我的驗證摘要中顯示錯誤消息以及其他表單錯誤。

我將此添加到我的視圖模型:

[Required] 
[Range(1, 1, ErrorMessage = "You must agree to the Terms and Conditions")] 
public bool AgreeTerms { get; set; } 

但沒有奏效。

有沒有一種簡單的方法來強制數據註釋的值爲真?

+0

自定義註釋很容易寫,你有沒有考慮過這個選項? – asawyer

+0

不適用於布爾型,但非常相似(並允許自定義錯誤消息):http://rical.blogspot.com/2012/03/server-side-custom-annotation.html – pkr298

回答

24
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Threading.Tasks; 
using System.Web.Mvc; 

namespace Checked.Entitites 
{ 
    public class BooleanRequiredAttribute : ValidationAttribute, IClientValidatable 
    { 
     public override bool IsValid(object value) 
     { 
      return value != null && (bool)value == true; 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      //return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "booleanrequired", ErrorMessage = this.ErrorMessage } }; 
      yield return new ModelClientValidationRule() 
      { 
       ValidationType = "booleanrequired", 
       ErrorMessage = this.ErrorMessageString 
      }; 
     } 
    } 
} 
6

您可以編寫一個已經提到的自定義驗證屬性。如果您正在進行客戶端驗證,您需要編寫自定義JavaScript以使不顯眼的驗證功能可以提取它。例如如果你正在使用jQuery:

// extend jquery unobtrusive validation 
(function ($) { 

    // add the validator for the boolean attribute 
    $.validator.addMethod(
    "booleanrequired", 
    function (value, element, params) { 

     // value: the value entered into the input 
     // element: the element being validated 
     // params: the parameters specified in the unobtrusive adapter 

     // do your validation here an return true or false 

    }); 

    // you then need to hook the custom validation attribute into the MS unobtrusive validators 
    $.validator.unobtrusive.adapters.add(
    "booleanrequired", // adapter name 
    ["booleanrequired"], // the names for the properties on the object that will be passed to the validator method 
    function(options) { 

     // set the properties for the validator method 
     options.rules["booleanRequired"] = options.params; 

     // set the message to output if validation fails 
     options.messages["booleanRequired] = options.message; 

    }); 

} (jQuery)); 

另一種方式(這是一個黑客位的,我不喜歡它)就是對模型中的一個屬性,它始終設置爲true,則使用CompareAttribute比較您的* AgreeTerms *屬性的值。簡單的是,但我不喜歡它:)

+0

鍵區分大小寫:booleanrequired booleanRequired –