2011-05-20 16 views
20

मैं एमवीसी 3 फॉर्म पर एकाधिक टेक्स्टबॉक्स को सत्यापन के उद्देश्यों के लिए एक के रूप में कैसे माना जाएगा?एकाधिक फ़ील्ड पर एमवीसी फॉर्म प्रमाणीकरण

यह एक साधारण फोन नंबर फ़ील्ड है जिसमें क्षेत्र कोड के लिए एक टेक्स्टबॉक्स है, एक उपसर्ग के लिए और एक अंतिम चार अंकों के लिए एक है।

1) वे सभी होगी:

वास्तव में दो मान्यता आवश्यकताएं होती हैं। 2) उनमें सभी को पूर्णांक होना चाहिए।

अब यह अलग-अलग क्षेत्रों के लिए ऐसा करने पर आसान है, लेकिन मैं एमवीसी के साथ एएसपी.NET कस्टम वैलिडेटर के बराबर कैसे बना सकता हूं ताकि मैं पूरी तरह से तीनों फ़ील्ड को मान्य कर सकूं?

+2

मेरे टिप्पणी अपने मान्यता प्रश्न को हल नहीं करता है, लेकिन मैं सोच रहा हूँ कि क्या यह है फोन नंबर प्रविष्टि के लिए उपयोग करने के लिए सबसे अच्छा यूआई। यह डिजाइन उपयोगकर्ता के लिए अधिक काम नहीं है; टेक्स्टबॉक्स के बीच टैब-टैबिंग, यदि वे फ़ोन नंबर पेस्ट करना चाहते हैं या पहले से दर्ज किए गए फ़ोन नंबर को हटाना चाहते हैं तो अधिक काम करें। मैंने सोचा होगा कि रेगेक्स-आधारित सत्यापन वाला एक टेक्स्टबॉक्स अधिक सामान्य होगा। –

+1

अगर मैं निर्णय ले रहा था, तो मैं कहूंगा कि आप सही हैं, लेकिन किसी कारण से किसी ने फैसला किया है कि इसे तीन टेक्स्ट बॉक्स होना चाहिए। मत पूछो :) – Scott

+0

ओच। क्या आप उन उदाहरणों के साथ अपनी राय मान सकते हैं जिन्हें मैंने उद्धृत किया है? साथ ही, मुझे लगता है कि आपको किसी भी गैर-यूएस लोगों को इस प्रणाली में अपने फोन नंबर दर्ज करने की आवश्यकता नहीं है ... क्योंकि हमारे अक्सर अलग-अलग स्वरूपित होते हैं। –

उत्तर

20

मैं वास्तव में इस समस्या के समाधान के लिए एक कस्टम ValidationAttribute को लागू करने, CompareAttribute में प्रस्तुत तर्क के एक ही प्रकार है कि आप मूल्यों का मूल्यांकन करने के प्रतिबिंब का उपयोग करने की अनुमति देता का उपयोग कर समाप्त हो गया अन्य गुणों के। यह मैं मॉडल स्तर के बजाय प्रॉपर्टी स्तर पर इसे लागू करने की अनुमति दी है और यह भी विनीत जावास्क्रिप्ट के माध्यम से ग्राहक साइड सत्यापन के लिए अनुमति देता है:

public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable 
    { 
     private readonly string[] _fields; 

     public MultiFieldRequiredAttribute(string[] fields) 
     { 
      _fields = fields; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      foreach (string field in _fields) 
      { 
       PropertyInfo property = validationContext.ObjectType.GetProperty(field); 
       if (property == null) 
        return new ValidationResult(string.Format("Property '{0}' is undefined.", field)); 

       var fieldValue = property.GetValue(validationContext.ObjectInstance, null); 

       if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString())) 
        return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
      } 

      return null; 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = this.ErrorMessage, 
       ValidationType = "multifield" 
      }; 
     } 
    } 
+0

मुझे क्लाइंट-साइड सत्यापन कार्य करने के लिए "आवश्यक" पर सत्यापन विधि टाइप करना पड़ा। मुझे यह जवाब मिला (http://stackoverflow.com/questions/13740489/valid-values-for-modelclientvalidationrule- validationtype-string) प्रमाणीकरण प्रकार स्वीकार किए गए मानों के साथ सहायक होने के लिए। – gmasselli

17

आप मॉडल कक्षा पर IValidatableObject डालकर और Validate विधि को लागू करके इसे संभाल सकते हैं।

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
     if (String.IsNullOrEmpty(_PhonePart1) || String.IsNullOrEmpty(_PhonePart2) 
      || String.IsNullOrEmpty(_PhonePart3)) 
     { 
      yield return new ValidationResult("You must enter all " + 
        "three parts of the number."); 
     } 

} 
1

स्कॉट, अपने दायरे के भीतर कस्टम मॉडल बांधने की मशीन का उपयोग कर रहा है:

यह कुछ इस तरह दिखाई सकता है? यदि ऐसा है, तो आप तीन टेक्स्ट फ़ील्ड्स से परिणामों को एक फोन नंबर फ़ील्ड में गठबंधन करने के लिए एक IModelBinder लागू कर सकते हैं, जिसे सत्यापन गुणों से सजाया जा सकता है। यहाँ एक stackoverflow सवाल ऐसा करने के तरीके का एक उदाहरण है कि है: DataAnnotation Validations and Custom ModelBinder

संबंधित मुद्दे