11

लागू मैं समान प्रश्न here पूछना लेकिन इस सवाल में मैं एक और कार्यान्वयन का उपयोग, वास्तव में this way निम्नलिखित कोड मेरे कार्यान्वयन दिखाने कस्टम सत्यापनकर्ता:ASP.NET MVC कस्टम सत्यापनकर्ता उपयोग IClientValidatable

public sealed class IsDateAfter : ValidationAttribute, IClientValidatable { 

    private readonly string testedPropertyName; 
    private readonly bool allowEqualDates; 

    public IsDateAfter(string testedPropertyName, bool allowEqualDates = false) 
    { 
     this.testedPropertyName = testedPropertyName; 
     this.allowEqualDates = allowEqualDates; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext 
validationContext) { 
     var propertyTestedInfo = 
validationContext.ObjectType.GetProperty(this.testedPropertyName); 
     if (propertyTestedInfo == null) { 
      return new ValidationResult(string.Format("unknown property 
{0}", this.testedPropertyName)); 
     } 

     var propertyTestedValue = 
propertyTestedInfo.GetValue(validationContext.ObjectInstance, null); 

     if (value == null || !(value is DateTime)) { 
      return ValidationResult.Success; 
     } 

     if (propertyTestedValue == null || !(propertyTestedValue is 
DateTime)) { 
      return ValidationResult.Success; 
     } 

     // Compare values 
     if ((DateTime)value >= (DateTime)propertyTestedValue) { 
      if (this.allowEqualDates) { 
       return ValidationResult.Success; 
      } 
      if ((DateTime)value > (DateTime)propertyTestedValue) { 
       return ValidationResult.Success; 
      } 
     } 

     return new 
ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 

    public IEnumerable<ModelClientValidationRule> 
GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     var rule = new ModelClientValidationRule { 
      ErrorMessage = this.ErrorMessageString, 
      ValidationType = "isdateafter" 
     }; 
     rule.ValidationParameters["propertytested"] = 
this.testedPropertyName; 
     rule.ValidationParameters["allowequaldates"] = 
this.allowEqualDates; 
     yield return rule; 
    } 
} 

स्क्रिप्ट:

$.validator.unobtrusive.adapters.add(
'isdateafter', ['propertytested', 'allowequaldates'], function (options) { 
    options.rules['isdateafter'] = options.params; 
    options.messages['isdateafter'] = options.message; 
}); 
$.validator.addMethod("isdateafter", function (value, element, params) { 
alert(params.propertytested); 
var startdatevalue = $('input[name="' + params.propertytested + '"]').val(); 
if (!value || !startdatevalue) return true; 
return (params.allowequaldates) ? Date.parse(startdatevalue) <= Date.parse(value) : 
Date.parse(startdatevalue) < Date.parse(value); 
}, ''); 

और मेरे _Layout पेज (मास्टर पेज)

<!DOCTYPE html> 
<html> 
<head> 
<title>@ViewBag.Title</title> 
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" 
type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" 
type="text/javascript"></script> 
</head> 
<body> 
<div class="page"> 
    <div id="header"> 
     <div id="title"> 
      <h1> 
       My MVC Application</h1> 
     </div> 
     <div id="logindisplay"> 
      @Html.Partial("_LogOnPartial") 
     </div> 
     <div id="menucontainer"> 
      <ul id="menu"> 
     <li>@Html.ActionLink("Departments", "Index", "Department")</li> 
      </ul> 
     </div> 
    </div> 
    <div id="main"> 
     @RenderBody() 
    </div> 
    <div id="footer"> 
    </div> 
</div> 
</body> 
</html> 
संपादित में निश्चित रूप से

और देखें पृष्ठों अन्य स्क्रिप्ट स्रोत बनाएं रूप में निम्नलिखित हैं:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
type="text/javascript"></script> 

पृष्ठ बनाएं पृष्ठ का एक हिस्सा:

<fieldset> 
<legend>Department</legend> 
<div class="editor-label"> 
<label for="Date1">Date1</label> 
</div> 
<div class="editor-field"> 
<input id="Date1" class="text-box single-line valid" type="text" value="" name="Date1" 
data-val-required="The Date1 field is required." data-val-isdateafter- 
propertytested="Date2" data-val-isdateafter-allowequaldates="False" data-val- 
isdateafter="O My" data-val="true"> 
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- 
    for="Date1"></span> 
</div> 
<div class="editor-label"> 
<label for="Date2">Date2</label> 
</div> 
<div class="editor-field"> 
<input id="Date2" class="text-box single-line valid" type="text" value="" name="Date2" 
data-val-required="The Date2 field is required." data-val="true"> 
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- 
for="Date2"></span> 
</div> 

मैं कार्यान्वयन के सभी कोशिश here के रूप में ही हो सकता है लेकिन ग्राहक के पक्ष में काम करते हैं और पोस्टबैक करने की जरूरत नहीं है कि, मैं उदाहरण के लिए किसी अन्य कार्यान्वयन this तरह Global.asax में रजिस्टर नहीं है करता है, किसी को इसके बारे में पता है? मैं वास्तव में उलझन में हूं, मैंने 2 तरीकों की कोशिश की लेकिन उनमें से कोई भी सही जवाब नहीं देता।

उत्तर

9

आपने अपनी स्क्रिप्ट समावेशन को गड़बड़ कर दिया है। अपने _Layout में आप उस क्रम में निम्न स्क्रिप्ट में शामिल हैं:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script> 

अब स्पष्ट रूप से jquery.validate.min.js और jquery.validate.js एक ही स्क्रिप्ट का प्रतिनिधित्व करता है, पहली minified संस्करण जा रहा है। लेकिन चूंकि आपने jquery.validate.unobtrusive.js स्क्रिप्ट शामिल नहीं की है (यह आपके विचार में बहुत बाद में किया गया है), आपकी कस्टम jQuery.IsDateAfter.js स्क्रिप्ट में त्रुटियां होंगी क्योंकि यह आपके द्वारा उपयोग किए जा रहे $.validator.unobtrusive.adapters ऑब्जेक्ट के बारे में नहीं जान पाएगी। तो यहाँ अपने लेआउट में स्क्रिप्ट देखना चाहिए का तरीका देखें:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

तुम भी अपने कस्टम jQuery.IsDateAfter.js स्क्रिप्ट लेआउट करने के लिए अंत में अगर आप मामले में इच्छा यह कई दृश्यों में प्रयोग किया जाता है और आप इसे नहीं जोड़ सकता है, तो जोड़ सकता है देखने के लिए:

<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script> 

यही एकमात्र स्क्रिप्ट है जो आपको देखना चाहिए। आपको अपने संपादन और दृश्य पृष्ठ बनाएं से किसी अन्य jquery.* स्क्रिप्ट समावेशन को हटा देना चाहिए।

टिप्पणी: आप यह भी देखेंगे कि मैंने आपके लेआउट से सभी Microsoft*.js स्क्रिप्ट हटा दी हैं। वे अप्रचलित हैं और अब एएसपी.नेट एमवीसी 3 में उपयोग नहीं किया जाना चाहिए।

+2

मैंने इसका पालन किया और सत्यापन फ़ॉर्म को देख सकते हैं जबकि मैं महान रूप को संपादित करता हूं। इसके बारे में एक अजीब बात यह है कि यह फॉर्म पोस्ट को रोक नहीं देता है, यहां तक ​​कि उचित सत्यापन त्रुटि संदेशों के साथ अमान्य फ़ील्ड भी है, हालांकि सर्वर मॉडलस्टेट को पहचानता है। यह वैध है ... क्या यह सामान्य व्यवहार है या क्या मुझे कुछ याद आ रही है? – afr0

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