दिलचस्प पोस्ट
नवीनतम संशोधित फाइल को लगातार निर्देशिका में कैसे खोजें? "रीडायरेक्ट टाओएक्शन" का उपयोग करने वाले नियंत्रक से एक हैश पर रीडायरेक्ट करें एपीके को उसी प्रमाणपत्र के साथ पिछले संस्करण के रूप में हस्ताक्षरित होना चाहिए जावा अंतिम संशोधक कॉलस्पान सभी स्तंभ जावा एफएक्स वेबव्यू पूरे क्षेत्र को भरने के लिए बढ़ता है MSVCP140.dll गायब है बाध्यकारी आइटम WPF DataGrid में ComboBoxColumn का स्रोत PHP में इंटरफेस का क्या मतलब है? एक HTTP प्रॉक्सी – पायथन का उपयोग करना मेवेन पैरेंट पॉम वि मॉड्यूल पॉम नमूनों में फ़्लैटन और रावेल फ़ंक्शंस के बीच अंतर क्या है? सूचक सी से सरणी का आकार प्राप्त करना क्यों file_get_contents () का उपयोग करते समय मुझे 500 त्रुटि मिल रही है, लेकिन ब्राउज़र में काम करता है? एनएटी (विनफॉर्म्स) में किसी रूप में नियंत्रण केंद्रों पर केंद्रित है?

एएसपी.नेट एमवीसी: डेटाएनेटेशन द्वारा कस्टम वैल्यूशन

मेरे पास एक मॉडल है जिसमें 4 गुण हैं जो कि प्रकार स्ट्रिंग के हैं I मुझे पता है कि आप स्ट्रिंग लैंग एनोटेशन का उपयोग करके एक एकल संपत्ति की लंबाई को मान्य कर सकते हैं। हालांकि मैं संयुक्त 4 गुणों की लंबाई को मान्य करना चाहता हूं।

डाटा एनोटेशन के साथ ऐसा करने के लिए MVC का तरीका क्या है?

मैं यह पूछ रहा हूँ क्योंकि मैं एमवीसी के लिए नया हूँ और अपना खुद का समाधान करने से पहले इसे सही तरीके से करना चाहता हूं।

वेब के समाधान से एकत्रित समाधान "एएसपी.नेट एमवीसी: डेटाएनेटेशन द्वारा कस्टम वैल्यूशन"

आप एक कस्टम सत्यापन विशेषता लिख ​​सकते हैं:

public class CombinedMinLengthAttribute: ValidationAttribute { public CombinedMinLengthAttribute(int minLength, params string[] propertyNames) { this.PropertyNames = propertyNames; this.MinLength = minLength; } public string[] PropertyNames { get; private set; } public int MinLength { get; private set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty); var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>(); var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length; if (totalLength < this.MinLength) { return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); } return null; } } 

और उसके बाद आपके पास एक दृश्य मॉडल हो सकता है और इसके साथ अपनी एक संपत्ति को सजाने के लिए:

 public class MyViewModel { [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")] public string Foo { get; set; } public string Bar { get; set; } public string Baz { get; set; } } 

स्व-मान्य मॉडल

आपका मॉडल एक इंटरफ़ेस IValidatableObject को लागू करना चाहिए Validate विधि में अपना सत्यापन कोड डालें:

 public class MyModel : IValidatableObject { public string Title { get; set; } public string Description { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Title == null) yield return new ValidationResult("*", new [] { nameof(Title) }); if (Description == null) yield return new ValidationResult("*", new [] { nameof(Description) }); } } 

कृपया ध्यान दें: यह एक सर्वर साइड सत्यापन है। यह क्लाइंट-साइड पर काम नहीं करता है फॉर्मेशन सबमिशन के बाद ही आपका सत्यापन किया जाएगा।

अभिव्यक्तिविज्ञापन आपको ऐसी संभावना देता है:

 [Required] [AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")] public string FieldA { get; set; } 

पृष्ठभूमि:

यह सुनिश्चित करने के लिए मॉडल मान्यताओं की आवश्यकता है कि हमें प्राप्त हुए डेटा मान्य और सही है ताकि हम इस डेटा के साथ आगे की प्रक्रिया कर सकें। हम एक क्रिया पद्धति में एक मॉडल को मान्य कर सकते हैं। अंतर्निहित सत्यापन विशेषताओं की तुलना करें, रेंज, रेगुलर एक्सपे्रेशन, आवश्यक, स्ट्रिंग लैनेथ है। हालांकि हमारे पास परिदृश्य हो सकते हैं, जिसमें हमें अंतर्निहित लोगों के अलावा अन्य मान्यताओं की आवश्यकता होती है।

कस्टम वैधीकरण विशेषताएँ

 public class EmployeeModel { [Required] [UniqueEmailAddress] public string EmailAddress {get;set;} public string FirstName {get;set;} public string LastName {get;set;} public int OrganizationId {get;set;} } 

एक कस्टम सत्यापन विशेषता बनाने के लिए, आपको इस वर्ग को मान्यकरण विशेषता से प्राप्त करना होगा।

 public class UniqueEmailAddress : ValidationAttribute { private IEmployeeRepository _employeeRepository; [Inject] public IEmployeeRepository EmployeeRepository { get { return _employeeRepository; } set { _employeeRepository = value; } } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var model = (EmployeeModel)validationContext.ObjectInstance; if(model.Field1 == null){ return new ValidationResult("Field1 is null"); } if(model.Field2 == null){ return new ValidationResult("Field2 is null"); } if(model.Field3 == null){ return new ValidationResult("Field3 is null"); } return ValidationResult.Success; } } 

उम्मीद है की यह मदद करेगा। चीयर्स!

संदर्भ

  • कोड प्रोजेक्ट – ASP.NET MVC3 में कस्टम वैधीकरण विशेषता
  • Haacked – ASP.NET MVC 2 कस्टम वैधीकरण

डरिन के उत्तर में सुधार करने के लिए, यह थोड़ा छोटा हो सकता है:

 public class UniqueFileName : ValidationAttribute { private readonly NewsService _newsService = new NewsService(); public override bool IsValid(object value) { if (value == null) { return false; } var file = (HttpPostedFile) value; return _newsService.IsFileNameUnique(file.FileName); } } 

आदर्श:

 [UniqueFileName(ErrorMessage = "Er bestaat al een afbeelding met deze naam")] 

ध्यान दें कि एक त्रुटि संदेश की आवश्यकता है, अन्यथा त्रुटि खाली होगी।

जवाब देने में थोड़ा देर हो चुकी है, लेकिन कौन खोज रहा है डेटा एनोटेशन के साथ अतिरिक्त संपत्ति का उपयोग कर आप आसानी से ऐसा कर सकते हैं:

 public string foo { get; set; } public string bar { get; set; } [MinLength(20, ErrorMessage = "too short")] public string foobar { get { return foo + bar; } } 

यही वह सब है जो वास्तव में यह है। यदि आप वास्तव में एक विशिष्ट स्थान में सत्यापन त्रुटि भी प्रदर्शित करना चाहते हैं, तो आप इसे अपने दृश्य में जोड़ सकते हैं:

 @Html.ValidationMessage("foobar", "your combined text is too short") 

यदि आप स्थानीयकरण करना चाहते हैं तो इस दृश्य में यह आसान काम कर सकता है

उम्मीद है की यह मदद करेगा!