दिलचस्प पोस्ट
मैं Excel VBA में एक परिवर्तित सेल का पुराना मान कैसे प्राप्त करूं? एक jQuery प्लगइन का विस्तार करने के लिए सबसे अच्छा तरीका आईओएस जावास्क्रिप्ट के साथ 5 से कम संस्करण का पता लगाएं jQuery UI Accordion विस्तार / संक्षिप्त सभी लेबल फ़ाइल अपलोड बटन जावास्क्रिप्ट: ओवरराइडिंग अलर्ट () मैं कैसे PHP सूची में पाश के साथ एक ही आईडी डेटा की सूची कर सकते हैं? आखिरकार ब्लॉक में लौटाए गए वैरिएबल को क्यों बदलता है, वापसी मूल्य नहीं बदलता है? PHP और mySQL: वर्ष 2038 बग: यह क्या है? इसे कैसे हल करें? सी ++ 11 में लैम्ब्डा अभिव्यक्ति क्या है? एचटीएमएल लिंक को अक्षम कैसे करें स्थानीय स्टोरेज पर छवि कैसे सहेज कर इसे अगले पृष्ठ पर प्रदर्शित करें? रंग पहियों बनाने के लिए फ़ंक्शन GoogleSignatureVerifier हस्ताक्षर मान्य संदेश नहीं है (Google Play सेवाओं 9.0.0) ClearCase में एक नया उपनिर्देशिका संरचना बनाना है?

अपेक्षित यदि कंडीशनल वैधीकरण विशेषता

मैं एक वैधानिकता विशेषता कार्यान्वित करने के बारे में जाने के सर्वोत्तम तरीके पर कुछ सलाह की तलाश कर रहा था जो निम्न करता है

आदर्श

public class MyInputModel { [Required] public int Id {get;set;} public string MyProperty1 {get;set;} public string MyProperty2 {get;set;} public bool MyProperty3 {get;set;} } 

मुझे एक मूल्य के साथ कम से कम प्रोप 1 प्रोप 3 प्रोप 3 होना चाहिए और यदि प्रोप 3 केवल एक ही भरी हुई भरी है तो इसे झूठी समान नहीं होना चाहिए। मैं इसके लिए एक सत्यापन विशेषता (एस?) लिखने के बारे में कैसे जाना होगा?

किसी भी मदद के लिए धन्यवाद!

वेब के समाधान से एकत्रित समाधान "अपेक्षित यदि कंडीशनल वैधीकरण विशेषता"

आप [RequiredIf] कस्टम सत्यापन विशेषता के एक नमूने के कार्यान्वयन के लिए निम्नलिखित ब्लॉग पोस्ट की जांच कर सकते हैं। यह एक अन्य संपत्ति के मूल्य के मुकाबले तुलना करता है, लेकिन आप अपनी आवश्यकताओं को पूरा करने के लिए आसानी से IsValid विधि को बदल सकते हैं।

कल कल मुझे एक ही समस्या थी, लेकिन मैंने इसे बहुत ही साफ तरीके से किया, जो दोनों ग्राहक पक्ष और सर्वर साइड सत्यापन के लिए काम करता है।

शर्त : मॉडल में अन्य प्रॉपर्टी के मूल्य के आधार पर, आप अन्य संपत्ति की आवश्यकता करना चाहते हैं। यहां कोड है

 public class RequiredIfAttribute : RequiredAttribute { private String PropertyName { get; set; } private Object DesiredValue { get; set; } public RequiredIfAttribute(String propertyName, Object desiredvalue) { PropertyName = propertyName; DesiredValue = desiredvalue; } protected override ValidationResult IsValid(object value, ValidationContext context) { Object instance = context.ObjectInstance; Type type = instance.GetType(); Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null); if (proprtyvalue.ToString() == DesiredValue.ToString()) { ValidationResult result = base.IsValid(value, context); return result; } return ValidationResult.Success; } } 

PropertyName का नाम वह संपत्ति है जिस पर आप अपनी स्थिति बनाना चाहते हैं
DesiredValue PropertyName (संपत्ति) का विशेष मूल्य है जिसके लिए आवश्यक अन्य आवश्यक गुणों के लिए आपके अन्य प्रॉपर्टी को मान्य होना चाहिए

कहें कि आपके पास निम्न है:

 public enum UserType { Admin, Regular } public class User { public UserType UserType {get;set;} [RequiredIf("UserType",UserType.Admin, ErrorMessageResourceName="PasswordRequired", ErrorMessageResourceType = typeof(ResourceString)) public string Password { get; set; } } 

आखिरकार, कम से कम, अपने एट्रिब्यूट के लिए एडॉप्टर को पंजीकृत करें, ताकि यह क्लाइंट साइड सत्यापन कर सकें (मैं इसे ग्लोबल.एएसएक्स, एपॉलेशन_स्टार्ट में डाल दिया)

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute), typeof(RequiredAttributeAdapter)); 

संपादित

कुछ लोग शिकायत कर रहे थे कि क्लाइंट की ओर कोई फर्क नहीं पड़ता कि वह क्या काम करता है या यह काम नहीं करता है। इसलिए मैंने जावास्क्रिप्ट के साथ सशर्त क्लाइंट साइड सत्यापन करने के लिए उपर्युक्त कोड को संशोधित किया। इस मामले के लिए आपको एडॉप्टर को पंजीकृत करने की आवश्यकता नहीं है

  public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { private String PropertyName { get; set; } private Object DesiredValue { get; set; } private readonly RequiredAttribute _innerAttribute; public RequiredIfAttribute(String propertyName, Object desiredvalue) { PropertyName = propertyName; DesiredValue = desiredvalue; _innerAttribute = new RequiredAttribute(); } protected override ValidationResult IsValid(object value, ValidationContext context) { var dependentValue = context.ObjectInstance.GetType().GetProperty(PropertyName).GetValue(context.ObjectInstance, null); if (dependentValue.ToString() == DesiredValue.ToString()) { if (!_innerAttribute.IsValid(value)) { return new ValidationResult(FormatErrorMessage(context.DisplayName), new[] { context.MemberName }); } } return ValidationResult.Success; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = ErrorMessageString, ValidationType = "requiredif", }; rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(PropertyName); rule.ValidationParameters["desiredvalue"] = DesiredValue is bool ? DesiredValue.ToString().ToLower() : DesiredValue; yield return rule; } } 

और अंत में जावास्क्रिप्ट (इसे बंडल और प्रस्तुत करना … अपनी स्क्रिप्ट फाइल में डाल दिया)

 $.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'desiredvalue'], function (options) { options.rules['requiredif'] = options.params; options.messages['requiredif'] = options.message; }); $.validator.addMethod('requiredif', function (value, element, parameters) { var desiredvalue = parameters.desiredvalue; desiredvalue = (desiredvalue == null ? '' : desiredvalue).toString(); var controlType = $("input[id$='" + parameters.dependentproperty + "']").attr("type"); var actualvalue = {} if (controlType == "checkbox" || controlType == "radio") { var control = $("input[id$='" + parameters.dependentproperty + "']:checked"); actualvalue = control.val(); } else { actualvalue = $("#" + parameters.dependentproperty).val(); } if ($.trim(desiredvalue).toLowerCase() === $.trim(actualvalue).toLocaleLowerCase()) { var isValid = $.validator.methods.required.call(this, value, element, parameters); return isValid; } return true; }); 

आवश्यकता के रूप में शामिल किए जाने के लिए आपको स्पष्ट रूप से अविश्वसनीय मान्य jquery की आवश्यकता है

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

इसका प्रयोग करके आप निम्न तरीके से इसके बारे में पूछा गया परिणाम प्राप्त कर सकते हैं:

 [RequiredIf("MyProperty2 == null && MyProperty3 == false")] public string MyProperty1 { get; set; } [RequiredIf("MyProperty1 == null && MyProperty3 == false")] public string MyProperty2 { get; set; } [AssertThat("MyProperty1 != null || MyProperty2 != null || MyProperty3 == true")] public bool MyProperty3 { get; set; } 

अभिव्यक्तिविज्ञान पुस्तकालय के बारे में अधिक जानकारी यहां पाई जा सकती है । अतिरिक्त केस-विशिष्ट विशेषताओं को लिखने की आवश्यकता के बिना या नियंत्रकों के भीतर मान्यता के अनिवार्य तरीका के उपयोग के बिना कई घोषणात्मक सत्यापन मामलों को सरल करना चाहिए।

मुझे एएसपी.नेट एमवीसी 5 पर काम करने के लिए मिला

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

टिप्पणियाँ

  • दोनों सर्वर और क्लाइंट साइड पर एमवीसी 5 पर काम किया: डी
  • मैंने "ExpressiveNnotations" लाइब्रेरी को बिल्कुल भी स्थापित नहीं किया था
  • मैं " डैन ह्यूनेक्स " से मूल कोड के बारे में ले रहा हूं, उसे ऊपर खोजें

युक्तियाँ इस त्रुटि को ठीक करने के लिए

"प्रकार सिस्टम। वेब। एमवीसी। आवश्यक एटएपेटर में एक सार्वजनिक कन्स्ट्रक्टर होना चाहिए जो कि सिस्टम। Web.Mvc.ModelMetadata, System.Web.Mvc.ControllerContext, और ExpressiveNnotations.Attributes.RequiredIfAttribute पैरामीटर नाम के तीन मापदंडों को स्वीकार करता है: adapterType"

टिप # 1: सुनिश्चित करें कि आप ' मान्य ऑट्रिब्यूट ' से वंचित नहीं हैं ' नहीं '

  public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { ...} 

टिप # 2: या ' ग्लोबल.एएसएक्स ' से इस पूरी लाइन को हटा दें, कोड के नए संस्करण में (डैन_ हूनेक्स द्वारा संपादित किए जाने के बाद) की आवश्यकता नहीं है, और ये पुरानी संस्करण में यह पंक्ति आवश्यक थी। ।

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute), typeof(RequiredAttributeAdapter)); 

युक्तियाँ जावास्क्रिप्ट कोड भाग काम पाने के लिए

1- कोड को एक नई जेएस फ़ाइल में डाल दिया (उदा: आवश्यक IFValidator.js)

2- $ (दस्तावेज़) के अंदर कोड को ताना .ready (function () {……..});

3- JQuery सत्यापन पुस्तकालयों को शामिल करने के बाद हमारी जेएस फ़ाइल शामिल करें, तो यह अब इस तरह दिखता है:

 @Scripts.Render("~/bundles/jqueryval") <script src="~/Content/JS/requiredIfValidator.js"></script> 

4- सी # कोड संपादित करें

से

 rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(PropertyName); 

सेवा मेरे

 rule.ValidationParameters["dependentproperty"] = PropertyName; 

और यहां ये

 if (dependentValue.ToString() == DesiredValue.ToString()) 

सेवा मेरे

 if (dependentValue != null && dependentValue.ToString() == DesiredValue.ToString()) 

मेरा संपूर्ण कोड अप और रनिंग

Global.asax

यहां जोड़ने के लिए कुछ नहीं, इसे साफ रखें

requiredIfValidator.js

~ / सामग्री या ~ / स्क्रिप्ट फ़ोल्डर में इस फ़ाइल को बनाइए

  $.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'desiredvalue'], function (options) { options.rules['requiredif'] = options.params; options.messages['requiredif'] = options.message; }); $(document).ready(function () { $.validator.addMethod('requiredif', function (value, element, parameters) { var desiredvalue = parameters.desiredvalue; desiredvalue = (desiredvalue == null ? '' : desiredvalue).toString(); var controlType = $("input[id$='" + parameters.dependentproperty + "']").attr("type"); var actualvalue = {} if (controlType == "checkbox" || controlType == "radio") { var control = $("input[id$='" + parameters.dependentproperty + "']:checked"); actualvalue = control.val(); } else { actualvalue = $("#" + parameters.dependentproperty).val(); } if ($.trim(desiredvalue).toLowerCase() === $.trim(actualvalue).toLocaleLowerCase()) { var isValid = $.validator.methods.required.call(this, value, element, parameters); return isValid; } return true; }); }); 

_Layout.cshtml या देखें

 @Scripts.Render("~/bundles/jqueryval") <script src="~/Content/JS/requiredIfValidator.js"></script> 

आवश्यक IfAttribute.cs क्लास

इसे कुछ बनाएं जहां आपकी प्रोजेक्ट में, उदाहरण के लिए ~ / models / customValidation /

  using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace Your_Project_Name.Models.CustomValidation { public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { private String PropertyName { get; set; } private Object DesiredValue { get; set; } private readonly RequiredAttribute _innerAttribute; public RequiredIfAttribute(String propertyName, Object desiredvalue) { PropertyName = propertyName; DesiredValue = desiredvalue; _innerAttribute = new RequiredAttribute(); } protected override ValidationResult IsValid(object value, ValidationContext context) { var dependentValue = context.ObjectInstance.GetType().GetProperty(PropertyName).GetValue(context.ObjectInstance, null); if (dependentValue != null && dependentValue.ToString() == DesiredValue.ToString()) { if (!_innerAttribute.IsValid(value)) { return new ValidationResult(FormatErrorMessage(context.DisplayName), new[] { context.MemberName }); } } return ValidationResult.Success; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = ErrorMessageString, ValidationType = "requiredif", }; rule.ValidationParameters["dependentproperty"] = PropertyName; rule.ValidationParameters["desiredvalue"] = DesiredValue is bool ? DesiredValue.ToString().ToLower() : DesiredValue; yield return rule; } } } 

आदर्श

  using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; using Your_Project_Name.Models.CustomValidation; namespace Your_Project_Name.Models.ViewModels { public class CreateOpenActivity { public Nullable<int> ORG_BY_CD { get; set; } [RequiredIf("ORG_BY_CD", "5", ErrorMessage = "Coordinator ID is required")] // This means: IF 'ORG_BY_CD' is equal 5 (for the example) > make 'COR_CI_ID_NUM' required and apply its all validation / data annotations [RegularExpression("[0-9]+", ErrorMessage = "Enter Numbers Only")] [MaxLength(9, ErrorMessage = "Enter a valid ID Number")] [MinLength(9, ErrorMessage = "Enter a valid ID Number")] public string COR_CI_ID_NUM { get; set; } } } 

देखें

यहां वास्तव में नोट करने के लिए कुछ नहीं …

  @model Your_Project_Name.Models.ViewModels.CreateOpenActivity @{ ViewBag.Title = "Testing"; } @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>CreateOpenActivity</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.ORG_BY_CD, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.ORG_BY_CD, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.ORG_BY_CD, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.COR_CI_ID_NUM, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.COR_CI_ID_NUM, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.COR_CI_ID_NUM, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } 

मैं इसके बाद के लिए एक परियोजना नमूना अपलोड कर सकता हूं …

आशा है कि यह उपयोगी था

धन्यवाद

यदि आप "ModelState.Remove" या "ModelState [" Prop "] का उपयोग करने का प्रयास करते हैं। त्रुटियाँ। क्लीनर ()" "ModelState.IsValid" stil गलत देता है।

मॉडल से डिफ़ॉल्ट "आवश्यक" टिप्पणी को न निकालने और नियंत्रक 'पोस्ट' कार्रवाई पर "ModelState.IsValid" से पहले अपना कस्टम सत्यापन क्यों न करें? इस कदर:

 if (!String.IsNullOrEmpty(yourClass.Property1) && String.IsNullOrEmpty(yourClass.dependantProperty)) ModelState.AddModelError("dependantProperty", "It´s necessary to select some 'dependant'."); 

यहां अन्य समाधानों से मुख्य अंतर यह है कि यह एक सर्वर साइड पर RequiredAttribute में तर्क को फिर से जोड़ता है, और required सत्यापन विधि का उपयोग क्लाइंट साइड पर संपत्ति depends है:

 public class RequiredIf : RequiredAttribute, IClientValidatable { public string OtherProperty { get; private set; } public object OtherPropertyValue { get; private set; } public RequiredIf(string otherProperty, object otherPropertyValue) { OtherProperty = otherProperty; OtherPropertyValue = otherPropertyValue; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { PropertyInfo otherPropertyInfo = validationContext.ObjectType.GetProperty(OtherProperty); if (otherPropertyInfo == null) { return new ValidationResult($"Unknown property {OtherProperty}"); } object otherValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null); if (Equals(OtherPropertyValue, otherValue)) // if other property has the configured value return base.IsValid(value, validationContext); return null; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "requiredif"; // data-val-requiredif rule.ValidationParameters.Add("other", OtherProperty); // data-val-requiredif-other rule.ValidationParameters.Add("otherval", OtherPropertyValue); // data-val-requiredif-otherval yield return rule; } } $.validator.unobtrusive.adapters.add("requiredif", ["other", "otherval"], function (options) { var value = { depends: function () { var element = $(options.form).find(":input[name='" + options.params.other + "']")[0]; return element && $(element).val() == options.params.otherval; } } options.rules["required"] = value; options.messages["required"] = options.message; }); 

एडेल मोरद और दान ह्यून्स से नोट्स का विस्तार करते हुए, मैंने एक उदाहरण प्रदान करने के लिए कोड को संशोधित किया है जो केवल ऐसे मान स्वीकार करता है जो दिए गए मान से मेल नहीं खाता।

मैंने यह भी पाया कि मुझे जावास्क्रिप्ट की आवश्यकता नहीं थी।

मैंने अपने मॉडल फ़ोल्डर में निम्न वर्ग जोड़ा है:

 public class RequiredIfNotAttribute : ValidationAttribute, IClientValidatable { private String PropertyName { get; set; } private Object InvalidValue { get; set; } private readonly RequiredAttribute _innerAttribute; public RequiredIfNotAttribute(String propertyName, Object invalidValue) { PropertyName = propertyName; InvalidValue = invalidValue; _innerAttribute = new RequiredAttribute(); } protected override ValidationResult IsValid(object value, ValidationContext context) { var dependentValue = context.ObjectInstance.GetType().GetProperty(PropertyName).GetValue(context.ObjectInstance, null); if (dependentValue.ToString() != InvalidValue.ToString()) { if (!_innerAttribute.IsValid(value)) { return new ValidationResult(FormatErrorMessage(context.DisplayName), new[] { context.MemberName }); } } return ValidationResult.Success; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = ErrorMessageString, ValidationType = "requiredifnot", }; rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(PropertyName); rule.ValidationParameters["invalidvalue"] = InvalidValue is bool ? InvalidValue.ToString().ToLower() : InvalidValue; yield return rule; } 

मेरे विचार में कोई भी परिवर्तन करने की आवश्यकता नहीं थी, लेकिन मेरे मॉडल के गुणों में बदलाव किया था:

  [RequiredIfNot("Id", 0, ErrorMessage = "Please select a Source")] public string TemplateGTSource { get; set; } public string TemplateGTMedium { get { return "Email"; } } [RequiredIfNot("Id", 0, ErrorMessage = "Please enter a Campaign")] public string TemplateGTCampaign { get; set; } [RequiredIfNot("Id", 0, ErrorMessage = "Please enter a Term")] public string TemplateGTTerm { get; set; } 

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

व्यू मॉोडल में, प्रत्येक फ़ील्ड के लिए आप किसी अन्य क्षेत्र के मूल्य के अनुसार मान्य करना चाहते हैं, निम्न लागू करें:

 public string FieldName { get; set; } [RequiredIf("FieldName", ConditionTypes.Equals, condition)] public string FieldName1 { get; set; }