2011-03-23 16 views
0

私のモジュールでは、asp.net MVC 3を使用しています。2つのタイプの支払いモードがあります。1.電信送金と2. PayPal。今、このタイプ1と2に応じてプロパティを保持する必要がありますかその他のデータ注釈!これを行う方法 ?例えばのための :タイプ1 - すなわち電信送金は、これらのフィールドを検証する必要があり、その後、選択された場合mvc条件付きモデル検証のヘルプ

支払いタイプ、

のためのラジオボタンがあります - 姓、名、電子メール、受益者名、銀行名は、 、銀行番号、ifscコードなど PayPalタイプの場合は、これらのフィールドは必須です - PayPalのメールアドレス。

これは手動検証によって行うことができますが、DataAnnotationsで適切な方法を実行する方法はありますか?

答えて

1

あなたはカスタム検証属性を記述し、それをあなたのモデルを飾ることができます:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class CustomValidationAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var model = value as MyViewModel; 
     if (model == null) 
     { 
      return false; 
     } 
     if (model.WireTransfer == 1) 
     { 
      return !string.IsNullOrEmpty(model.FirstName) && 
        !string.IsNullOrEmpty(model.LastName); 
     } 
     else if (model.WireTransfer == 2) 
     { 
      return !string.IsNullOrEmpty(model.PaypalEmail); 
     } 
     return false; 
    } 
} 

、その後、あなたのメインモデルに:

[CustomValidation] 
public class MyViewModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    ... 
} 
+0

thnx !!問題は、この場合、クライアント側の検証は動作しませんでしょうか? – bhuvin

+0

@bhuvin、いいえ、うまくいかないでしょうが、IClientValidatableを実装することで動作させることができます:http://devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp .net-mvc-3-part-2 –

+0

@ダリンは他のものと一緒に試してみましたが、まだ動作していません – bhuvin

0

私はSimon Ince's blog postからのアプローチを使用している、それがうまく機能。基本的に彼はRequiredIfデータ属性を作成します。この属性では、現在のフィールドを必須にするために必要なその他のプロパティと値を指定できます。

4

Simon Inceのブログ記事は古くなっているようです。

DataAnnotationsModelValidatorを使用する必要はなく、DataAnnotationsModelValidatorを登録する必要はありません。

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)] 
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { 
    private const string _defaultErrorMessage = "'{0}' is required when {1} equals {2}."; 

    public string DependentProperty { get; set; } 
    public object TargetValue { get; set; } 

    public RequiredIfAttribute(string dependentProperty, object targetValue):base(_defaultErrorMessage) { 
     this.DependentProperty = dependentProperty; 
     this.TargetValue = targetValue; 
    } 
    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, DependentProperty, TargetValue); 
    } 
    protected override ValidationResult IsValid(object value, ValidationContext context) { 
     if (context.ObjectInstance != null) { 
      Type type = context.ObjectInstance.GetType(); 
      PropertyInfo info = type.GetProperty(DependentProperty); 
      object dependentValue; 
      if (info != null) { 
       dependentValue = info.GetValue(context.ObjectInstance, null); 
       if (object.Equals(dependentValue, TargetValue)) { 
        if (string.IsNullOrWhiteSpace(Convert.ToString(value))) { 
         return new ValidationResult(ErrorMessage); 
        } 
       } 
      } 
     } 
     return ValidationResult.Success; 
    } 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     ModelClientValidationRule rule = new ModelClientValidationRule(); 
     rule.ErrorMessage = this.FormatErrorMessage(metadata.PropertyName); 
     rule.ValidationType = "requiredif"; 
     rule.ValidationParameters.Add("depedentproperty", DependentProperty); 
     rule.ValidationParameters.Add("targetvalue", TargetValue); 
     yield return rule; 
    } 
} 

とJavaScript側:

次のコードを使用することができますあなたはjqueryのを使用している場合:

私はMVC 3を使用するために私の例を更新しました
$.validator.unobtrusive.adapters.add('requiredif', ['depedentproperty', 'targetvalue'], function (options) { 
    options.rules["required"] = function (element) { 
     return $('#' + options.params.depedentproperty).val() == options.params.targetvalue 
    }; 
    if (options.message) { 
     options.messages["required"] = options.message; 
    } 
    $('#' + options.params.depedentproperty).blur(function() { 
     $('#' + options.element.name).valid(); 
    }); 
});