2010-03-15 21 views
6

के साथ दो गुणों को कैसे सत्यापित करें मैं बस एएसपी.नेट एमवीसी 2 के साथ शुरू कर रहा हूं, और सत्यापन के साथ खेल रहा हूं।एएसपी.नेट एमवीसी 2

मान लीजिए कि मैं 2 गुण होते हैं दो:

  • password1
  • Password2

और मैं की आवश्यकता होती है कि वे दोनों में भर रहे हैं चाहते हैं, और अपेक्षा करते हैं कि दोनों मॉडल से पहले ही कर रहे हैं यह सही है।

मेरे पास "न्यू यूज़र" नामक एक साधारण श्रेणी है।

मैं इसे कैसे कार्यान्वित करूं? मैंने प्रमाणीकरण एट्रिब्यूट के बारे में पढ़ा है, और इसे समझ लिया है। लेकिन मैं नहीं देखता कि मैं उस सत्यापन को लागू करने के लिए कैसे उपयोग करूंगा जो एक दूसरे के खिलाफ दो या दो से अधिक गुणों की तुलना करता है।

अग्रिम धन्यवाद! समाधान नीचे साथ

समस्या:

तो एक :

इस एक आवेदन करने के लिए लागू किया जाता है, और ModelBinder मॉडल के सत्यापन चलाता है, तो एक समस्या है संपत्ति-स्तर सत्यापन प्रमाणीकरण में कोई त्रुटि है, तो कक्षा-स्तर सत्यापन प्रमाणीकरणनहीं मान्य। मुझे अभी तक इस समस्या का समाधान नहीं मिला है।

यदि आपके पास इस समस्या का समाधान है तो कृपया अपना अनुभव साझा करें। आपका बहुत बहुत धन्यवाद!

उत्तर

7

विजुअल स्टूडियो के डिफ़ॉल्ट एएसपी.नेट एमवीसी 2 टेम्पलेट में आपको आवश्यक सटीक सत्यापन विशेषता शामिल है। AccountModels.cs फ़ाइल से पेस्ट किया गया:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)] 
public sealed class PropertiesMustMatchAttribute : ValidationAttribute { 
    private const string _defaultErrorMessage = 
     "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, 
     string confirmProperty) 
     : base(_defaultErrorMessage) { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId { 
     get { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, 
      true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, 
      true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

उपयोग कैसे करें:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")] 
class NewUser { 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 
} 
+1

समस्या सिर्फ मैं इस के साथ देख सकते हैं, जब मॉडल (इस मामले में वर्ग) के दो गुण, बराबर नहीं हैं, यह विशिष्ट गुणों को त्रुटियों के रूप में इंगित नहीं करता है, जैसे कि [आवश्यक] और <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, मैं देखता हूं। हालांकि मुझे यकीन नहीं है कि मॉडल बाइंडिंग का उपयोग करके इसे अन्य तरीके से काम करने के लिए एक सुरुचिपूर्ण समाधान है। आखिरकार, यह तकनीकी रूप से एक वर्ग स्तरीय सत्यापन है। यदि आपको ** ** गुणों में त्रुटियों को जोड़ना होगा, तो बाध्यकारी के बाद अधिकतम नियंत्रक में दो मानों को जांचना सबसे तेज़ समाधान होगा (हालांकि सबसे सुरुचिपूर्ण नहीं)। –

+0

एमवीसी 2 संस्करण में एचटीएमएल। वैलिडेशनसमरी सहायक विधि अब मॉडल-स्तर केवल त्रुटियों को प्रदर्शित कर सकता है – murki

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