ASP.NET MVC3の控えめな検証

少し前に、私はASP.NET MVCでサイトの開発を開始しました。私のプロジェクトの1つでは、別の要素の値に応じてフォーム要素の必須入力をチェックする非標準バリデーターが必要でした。 これが私が話したいことです。



このサイトは、自動車に関するトピックについて開発されました。 バリデーターの必要性は、登録フォームに記載されています。 ユーザーは、個人および自動車ディーラーとして登録できます。 ユーザーが自動車ディーラーとして登録する場合は、いくつかの追加の必須フィールドに入力する必要があります。 もちろん、いくつかの段階で登録を行うこともできましたが、登録プロセス全体を1つのステップで実行したかったのです。





サーバー側




独自のバリデーターを作成するには、ValidationAttributeクラスから継承する必要があります。



[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] public sealed class RequiredIfAttribute : ValidationAttribute, IClientValidatable { //,    . private const string _defaultErrorMessage = "{0} is required"; //  private string _targetPropertyName; //   private bool _targetPropertyCondition; public RequiredIfAttribute(string targetPropertyName, bool targetPropertyCondition) : base(_defaultErrorMessage) { this._targetPropertyName = targetPropertyName; this._targetPropertyCondition = targetPropertyCondition; } public override string FormatErrorMessage(string name) { return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, name, _targetPropertyName, _targetPropertyCondition); } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { bool result = false; bool propertyRequired = false; //       . //   var targetProperty = validationContext.ObjectType.GetProperty(_targetPropertyName); //    var targetPropertyValue = (bool)targetProperty.GetValue(validationContext.ObjectInstance, null); //     ,      . if (targetPropertyValue == _targetPropertyCondition) { propertyRequired = true; } if (propertyRequired) { //    if (value == null) { var message = FormatErrorMessage(validationContext.DisplayName); return new ValidationResult(message); } } return null; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "requiredif"; rule.ValidationParameters.Add("targetpropertyname", this._targetPropertyName); rule.ValidationParameters.Add("targetpropertyvalue", this._targetPropertyCondition.ToString().ToLower()); yield return rule; } }
      
      







_defaultErrorMessageでユーザーに表示される属性のエラーメッセージを定義し、2つのフィールド_targetPropertyNameと_targetPropertyConditionを定義します。これらのフィールドは、モデル内のフィールドの名前を格納します。それぞれこのフィールドの値。



クライアント検証を実装するには、IClientValidatableインターフェイスを継承する必要があります。 GetClientValidationRulesメソッドで、エラーメッセージ、バリデーターのタイプ、およびバリデーターのパラメーターを示す新しいルールを作成します。 その後、これらすべてがフォームのマークアップに追加されます。







クライアント部




これで、サーバー部分が完成しました。 クライアント部分に移りましょう。 バリデーターがクライアント側で機能するためには、独自の検証関数とアダプターを作成する必要があります。



 $(function () { $.validator.addMethod("requiredif", function (value, element, param) { if ($(param.propertyname).is(':checked').toString() == param.propertyvalue) { if (!this.depend(param, element)) return "dependency-mismatch"; switch (element.nodeName.toLowerCase()) { case 'select': var val = $(element).val(); return val && val.length > 0; case 'input': if (this.checkable(element)) return this.getLength(value, element) > 0; default: return $.trim(value).length > 0; } } return true; }); $.validator.unobtrusive.adapters.add("requiredif", ["targetpropertyname", "targetpropertyvalue"], function (options) { if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { options.rules["requiredif"] = { propertyname: "#" + options.params.targetpropertyname, propertyvalue: options.params.targetpropertyvalue }; options.messages["requiredif"] = options.message; } }); } (jQuery));
      
      







使用法:




使用するには、対応するフィールドのモデルでRequiredIf属性を指定する必要があります。



 public class RegisterModel { [Required] [Display(Name = "First name")] public string FirstName { get; set; } [Required] [Display(Name = "Last name")] public string LastName { get; set; } [Required] [DataType(DataType.EmailAddress)] [Display(Name = "Email address")] [RegularExpression("^([A-Za-z0-9_\\-\\.])+\\@([A-Za-z0-9_\\-\\.])+\\.([A-Za-z]{2,4})$", ErrorMessage = "Not a valid email.")] public string Email { get; set; } [Display(Name = "Dealer")] public bool IsDealer { get; set; } [RequiredIf("IsDealer", true)] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)] [Display(Name = "Dealer name")] public string Name { get; set; } }
      
      







また、ページにスクリプトを追加します。

  <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.requiredif.js")" type="text/javascript"></script>
      
      







その結果、サーバー側とクライアント側の両方で機能する非常に便利なバリデーターが得られました。







PS:ASP.NET MVC3モードの控えめな検証のデフォルトでは無効になっています。 2つの方法で有効にできます。 まず、Web.configファイルを使用します。



  <appSettings> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>
      
      







コードで指定することもできます。



 HtmlHelper.ClientValidationEnabled = true; HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
      
      







また、ビューにいくつかのJavaScriptファイルを追加する必要があります。



 <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
      
      






All Articles