2010-01-05 13 views
7

मैं वर्तमान में एमवीसी सत्यापन के माध्यम से काम करने की कोशिश कर रहा हूं, और कुछ समस्याओं के खिलाफ आ रहा हूं जहां किसी अन्य क्षेत्र के मूल्य के आधार पर एक फ़ील्ड आवश्यक है। एक उदाहरण नीचे है (कि मुझे अभी तक पता नहीं लगाया गया है) - यदि भुगतान विधि == "जांचें", तो चेकनाम की आवश्यकता होनी चाहिए, अन्यथा इसे छोड़ दिया जा सकता है।Asp.Net एमवीसी प्रमाणीकरण - निर्भर फ़ील्ड

[Required(ErrorMessage = "Payment Method must be selected")] 
public override string PaymentMethod 
{ get; set; } 

[Required(ErrorMessage = "ChequeName is required")] 
public override string ChequeName 
{ get; set; } 

मैं के लिए [आवश्यक] System.ComponentModel.DataAnnotations उपयोग कर रहा हूँ, और यह भी कोशिश करते हैं और इस काम के पाने के लिए एक ValidationAttribute विस्तार किया है, लेकिन मैं एक चर के माध्यम से सत्यापन करने के लिए पारित नहीं हो सकता (नीचे विस्तार)

public class JEPaymentDetailRequired : ValidationAttribute 
{ 
    public string PaymentSelected { get; set; } 
    public string PaymentType { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (PaymentSelected != PaymentType) 
      return true; 
     var stringDetail = (string) value; 
     if (stringDetail.Length == 0) 
      return false; 
     return true; 
    } 
} 

कार्यान्वयन:

[JEPaymentDetailRequired(PaymentSelected = PaymentMethod, PaymentType = "Cheque", ErrorMessage = "Cheque name must be completed when payment type of cheque")] 

किसी को भी मान्यता की इस तरह के साथ अनुभव हुआ है? क्या यह नियंत्रक में लिखना बेहतर होगा?

आपकी मदद के लिए धन्यवाद।

+0

दूसरे विचार पर ... आप भुगतान चयन = भुगतान विधि कैसे सेट कर सकते हैं? आपको एक त्रुटि मिलनी चाहिए क्योंकि PaymentMethod निरंतर अभिव्यक्ति नहीं है। – Min

+0

हाय मिन, आप सही हैं। मैंने सोचा कि मैं इसे इस तरह से करने में सक्षम हो सकता हूं लेकिन यह काम नहीं करता है। मैं सिर्फ यह दिखाना चाहता था कि मैंने क्या प्रयास किया था, लेकिन यह भी टिप्पणी की कि यह मुझे चर के माध्यम से पारित करने की अनुमति नहीं देगा। –

उत्तर

3

मैं मॉडल में सत्यापन तर्क लिखूंगा, नियंत्रक नहीं। नियंत्रक को केवल दृश्य और मॉडल के बीच बातचीत को संभालना चाहिए। चूंकि यह मॉडल है जिसके लिए सत्यापन की आवश्यकता है, मुझे लगता है कि इसे सत्यापन तर्क के लिए व्यापक रूप से माना जाता है।

सत्यापन के लिए जो किसी अन्य संपत्ति या फ़ील्ड के मूल्य पर निर्भर करता है, मैं (दुर्भाग्यवश) मॉडल में उस के लिए कुछ कोड लिखने से पूरी तरह से बचने के लिए नहीं देखता, जैसे Wrox ASP.NET MVC पुस्तक में दिखाया गया है, इस प्रकार की तरह:

public bool IsValid 
{ 
    get 
    { 
    SetRuleViolations(); 
    return (RuleViolations.Count == 0); 
    } 
} 

public void SetRuleViolations() 
{ 
    if (this.PaymentMethod == "Cheque" && String.IsNullOrEmpty(this.ChequeName)) 
    { 
    RuleViolations.Add("Cheque name is required", "ChequeName"); 
    } 
} 

सभी मान्यताओं को घोषित करना बहुत अच्छा होगा। मुझे यकीन है कि आप RequiredDependentAttribute बना सकते हैं, लेकिन यह केवल इस प्रकार के तर्क को संभालेगा। सामग्री जो थोड़ा और जटिल है, उसे अभी तक एक और सुंदर विशिष्ट विशेषता आदि की आवश्यकता होगी जो जल्दी पागल हो जाता है।

+0

धन्यवाद djuth, मैंने मॉडलस्टेट डिक्शनरी ली है और मॉडल में इसके साथ सत्यापन किया है, और फिर मॉड्यूलस्टेट में विलय करने के लिए शब्दकोश को वापस नियंत्रक को पास कर दिया है। ऐसा लगता है कि यह चाल चल रहा है और मुझे कुछ प्रोग्रामेटिक काम करने की इजाजत देता है - प्रति विशेषता घोषित करने के लिए उतना ही अच्छा नहीं है, लेकिन कम से कम मैं एक ही स्थान पर सबकुछ प्राप्त कर सकता हूं। यह सुनिश्चित नहीं है कि प्रति विशेषता एक से अधिक त्रुटि होने पर यह कैसे होगा। –

2

आपकी समस्या को अपेक्षाकृत आसानी से conditional validation attribute के उपयोग से हल किया जा सकता है।

[RequiredIf("PaymentMethod == 'Cheque'")] 
public string ChequeName { get; set; } 
4

आप अलावा ग्राहक साइड सत्यापन चाहते हैं सर्वर पर मान्यता मॉडल करने के लिए, मुझे लगता है कि जाने के लिए सबसे अच्छा तरीका है एक कस्टम मान्यता विशेषता है (जैसे Jaroslaw सुझाव दिया)। मैं यहां उपयोग किए जाने वाले स्रोत का स्रोत शामिल कर रहा हूं।

कस्टम विशेषता:

public class RequiredIfAttribute : DependentPropertyAttribute 
{ 
    private readonly RequiredAttribute innerAttribute = new RequiredAttribute(); 

    public object TargetValue { get; set; } 


    public RequiredIfAttribute(string dependentProperty, object targetValue) : base(dependentProperty) 
    { 
     TargetValue = targetValue; 
    } 


    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     // get a reference to the property this validation depends upon 
     var containerType = validationContext.ObjectInstance.GetType(); 
     var field = containerType.GetProperty(DependentProperty); 

     if (field != null) 
     { 
      // get the value of the dependent property 
      var dependentvalue = field.GetValue(validationContext.ObjectInstance, null); 

      // compare the value against the target value 
      if ((dependentvalue == null && TargetValue == null) || 
       (dependentvalue != null && dependentvalue.Equals(TargetValue))) 
      { 
       // match => means we should try validating this field 
       if (!innerAttribute.IsValid(value)) 
        // validation failed - return an error 
        return new ValidationResult(ErrorMessage, new[] { validationContext.MemberName }); 
      } 
     } 

     return ValidationResult.Success; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
         { 
          ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
          ValidationType = "requiredif" 
         }; 

     var depProp = BuildDependentPropertyId(DependentProperty, metadata, context as ViewContext); 

     // find the value on the control we depend on; 
     // if it's a bool, format it javascript style 
     // (the default is True or False!) 
     var targetValue = (TargetValue ?? "").ToString(); 
     if (TargetValue != null) 
      if (TargetValue is bool) 
       targetValue = targetValue.ToLower(); 

     rule.ValidationParameters.Add("dependentproperty", depProp); 
     rule.ValidationParameters.Add("targetvalue", targetValue); 

     yield return rule; 
    } 
} 

Jquery सत्यापन विस्तार:

$.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'targetvalue'], function (options) { 
    options.rules['requiredif'] = { 
     dependentproperty: options.params['dependentproperty'], 
     targetvalue: options.params['targetvalue'] 
    }; 
    options.messages['requiredif'] = options.message; 
}); 

$.validator.addMethod('requiredif', 
    function (value, element, parameters) { 
     var id = '#' + parameters['dependentproperty']; 

     // get the target value (as a string, 
     // as that's what actual value will be) 
     var targetvalue = parameters['targetvalue']; 
     targetvalue = (targetvalue == null ? '' : targetvalue).toString(); 

     // get the actual value of the target control 
     var actualvalue = getControlValue(id); 

     // if the condition is true, reuse the existing 
     // required field validator functionality 
     if (targetvalue === actualvalue) { 
      return $.validator.methods.required.call(this, value, element, parameters); 
     } 

     return true; 
    } 
); 

विशेषता के साथ एक संपत्ति सजा:

[Required] 
public bool IsEmailGiftCertificate { get; set; } 

[RequiredIf("IsEmailGiftCertificate", true, ErrorMessage = "Please provide Your Email.")] 
public string YourEmail { get; set; } 
+0

मुझे एहसास है कि यह जवाब 2 साल पुराना है, लेकिन मैं इसे काम करने की कोशिश कर रहा हूं और मूल रूप से यह निर्भर संपत्ति पर सत्यापन को सक्रिय करता है इससे कोई फर्क नहीं पड़ता कि पहली संपत्ति का मूल्य क्या है। किसी भी सहायता की सराहना की जाएगी। –

3

बस ऐसे ही Codeplex पर उपलब्ध है सीधा सत्यापन लाइब्रेरी का उपयोग : https://foolproof.codeplex.com/

यह निम्न "requiredif" सत्यापन विशेषताओं का समर्थन करता है/सजावट:

[RequiredIf] 
[RequiredIfNot] 
[RequiredIfTrue] 
[RequiredIfFalse] 
[RequiredIfEmpty] 
[RequiredIfNotEmpty] 
[RequiredIfRegExMatch] 
[RequiredIfNotRegExMatch] 

आरंभ करने के लिए आसान है:

  1. दिए गए लिंक
  2. से पैकेज डाउनलोड करने के लिए कोई संदर्भ जोड़ें .dll फ़ाइल
  3. शामिल जावास्क्रिप्ट फ़ाइलों को आयात करें
  4. सुनिश्चित करें कि आपका vi ews संदर्भित जावास्क्रिप्ट फ़ाइलों को अपने HTML के भीतर अविभाज्य जावास्क्रिप्ट और jquery सत्यापन के लिए संदर्भित करता है।
संबंधित मुद्दे