2011-02-09 20 views
7

मैं विषय पर ScottGU's blog post पढ़ने के बाद एएसपीनेट एमवीसी में क्लाइंट साइड सत्यापन सुविधाओं के साथ झुका रहा हूं। यह System.Componentmodel.DataAnnotations उपयोग करने के लिए बहुत आसान है इस तरह जिम्मेदार बताते हैं:एएसपीएनटी एमवीसी क्लाइंट साइड सत्यापन

[Required(ErrorMessage = "You must specify a reason")] 
    public string ReasonText { get; set; } 

... लेकिन अगर आप कुछ सिर्फ एक छोटे से अधिक जटिल की जरूरत है क्या होता है। यदि आपके पास पोस्टलकोड और कंट्रीकोड फ़ील्ड के साथ पता श्रेणी है तो क्या होगा। आप प्रत्येक देश के लिए एक अलग रेगेक्स के खिलाफ डाक कोड को सत्यापित करना चाहते हैं। [0-9] {5} संयुक्त राज्य अमेरिका के लिए काम करता है, लेकिन आपको कनाडा के लिए एक अलग की जरूरत है।

मैं अपने स्वयं के प्रमाणीकरण सेवा कक्षा को रोल करके उस पर पहुंच गया जो नियंत्रक की मॉडलस्टेट संपत्ति लेता है और इसके अनुसार इसे मान्य करता है। यह सर्वर की तरफ बढ़िया काम करता है लेकिन फैंसी न्यू क्लाइंट साइड सत्यापन के साथ काम नहीं करता है।

वेबफॉर्म में मैं आवश्यक सामग्री के लिए आवश्यक फ़ील्ड वैलिडेटर या तुलना वैलिडेटर जैसे जावास्क्रिप्ट-उत्सर्जक नियंत्रणों का उपयोग करता हूं और फिर जटिल नियमों के लिए कस्टम वैलिडेटर का उपयोग करता हूं। इस तरह मेरे पास एक ही स्थान पर मेरा सभी सत्यापन तर्क है, और मुझे सरल सामान (9 0% समय) के लिए तेज़ जावास्क्रिप्ट सत्यापन का लाभ मिलता है, जबकि मुझे अभी भी बैकस्टॉप के रूप में सर्वर साइड सत्यापन की सुरक्षा मिलती है।

एमवीसी में समकक्ष दृष्टिकोण क्या होगा?

+0

मुझे इस पर यकीन नहीं है, लेकिन मुझे लगता है कि आपको इस तरह की कस्टम चीजों के लिए अपने स्वयं के ग्राहक सत्यापन को रोल करना होगा। शायद Jquery प्रमाणीकरण-http: //docs.jquery.com/Plugins/validation – Vishal

+0

एएसपी.नेट एमवीसी का कौन सा संस्करण आप लक्षित कर रहे हैं? –

उत्तर

1

मैंने अभी एमवीसी 3 में IValidalidableObject इंटरफेस के बारे में कुछ देखा और मैं इसे आज़मा दूंगा।

1

ValidationAttribute से अपनी खुद की सत्यापन विशेषता प्राप्त करें और तदनुसार तर्क लागू करें। एमवीसी 2 में, किसी अन्य संपत्ति के मूल्य के आधार पर किसी संपत्ति के सत्यापन को निष्पादित करने के लिए, यह वैलिडेटर के अंदर किया जाना चाहिए जिसे आप कस्टम सत्यापन विशेषता के साथ उपयोग करने के लिए पंजीकरण करते हैं (DataAnnotationsModelValidatorProvider का उपयोग करके मानते हैं)

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidationAttribute), typeof(ValidationValidator)); 

क्योंकि सत्यापन विशेषता में, आपके पास केवल उस संपत्ति मान तक पहुंच है जिस पर विशेषता बाध्य है और मॉडल नहीं है।

यह दृष्टिकोण देखने के लिए MVC FoolProof Validation पर एक नज़र डालें।

+0

क्या यह स्वचालित रूप से बॉक्स क्लाइंट साइड सत्यापन के बाहर उठाया जाता है? – CRice

+0

@CRice - यदि System.ComponentModel.DataAnnotations में किसी एक विशेषता से प्राप्त होता है, तो क्लाइंट पक्ष की देखभाल आपके लिए की जाएगी। यदि आपके स्वयं के सत्यापन एटिरबूट को परिभाषित करना है, तो आपको क्लाइंट साइड लॉजिक को लिखने की भी देखभाल करनी होगी। आपके द्वारा jQuery सत्यापन का उपयोग करने का मानना ​​है, जब आप सत्यापन नियम कुंजी से मेल खाते हैं तो उपयोग करने के लिए स्ट्रिंग द्वारा की गई jQuery सत्यापन को कॉल करने के लिए आप एक सत्यापनकर्ता फ़ंक्शन जोड़ देंगे। –

+0

सिस्टम को कैसे पता चलता है कि सिस्टम से प्राप्त किसी भी कस्टम क्लास को वैध करने के लिए आउटपुट करने के लिए जावास्क्रिप्ट का उपयोग कैसे किया जाता है। कॉम्पोनेंट मॉडेल। डेटाएनोटेशन। वैलिडेशन एट्रिब्यूट? – CRice

7

संपादित करें: यह मानता है कि आप एमवीसी 3 का उपयोग कर रहे हैं। दुर्भाग्य से मेरा कोड वीबी.नेट में है क्योंकि मुझे काम पर इसका उपयोग करना है।

सबकुछ नए अविभाज्य सत्यापन के साथ अच्छी तरह से काम करने के लिए कुछ चीजें हैं जो आपको करना है। मैंने कुछ हफ्ते पहले उनके माध्यम से संचालित किया था।

सबसे पहले, ValidationAttribute से प्राप्त एक कस्टम विशेषता वर्ग बनाएं। एक साधारण आवश्यक अगर विशेषता वर्ग नीचे है:

Imports System.ComponentModel 
Imports System.ComponentModel.DataAnnotations 

<AttributeUsage(AttributeTargets.Field Or AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> _ 
Public NotInheritable Class RequiredIfAttribute 
    Inherits ValidationAttribute 

    Private Const _defaultErrorMessage As String = "'{0}' is required." 
    Private ReadOnly _dependentProperty As String 
    Private ReadOnly _targetValues  As Object() 

    Public Sub New(dependentProperty As String, targetValues As Object()) 

     MyBase.New(_defaultErrorMessage) 

     _dependentProperty = dependentProperty 
     _targetValues  = targetValues 

    End Sub 

    Public Sub New(dependentProperty As String, targetValues As Object(), errorMessage As String) 

     MyBase.New(errorMessage) 

     _dependentProperty = dependentProperty 
     _targetValues  = targetValues 

    End Sub 

    Public ReadOnly Property DependentProperty() As String 
     Get 
      Return _dependentProperty 
     End Get 
    End Property 

    Public ReadOnly Property TargetValues() As Object() 
     Get 
      Return _targetValues 
     End Get 
    End Property 

    Public Overrides Function FormatErrorMessage(name As String) As String 

     Return String.Format(Globalization.CultureInfo.CurrentUICulture, ErrorMessageString, name) 

    End Function 

    Protected Overrides Function IsValid(value As Object, context As ValidationContext) As ValidationResult 

     ' find the other property we need to compare with using reflection 
     Dim propertyValue = context.ObjectType.GetProperty(DependentProperty).GetValue(context.ObjectInstance, Nothing).ToString() 

     Dim match = TargetValues.SingleOrDefault(Function(t) t.ToString().ToLower() = propertyValue.ToLower()) 

     If match IsNot Nothing AndAlso value Is Nothing Then 
      Return New ValidationResult(FormatErrorMessage(context.DisplayName)) 
     End If 

     Return Nothing 

    End Function 

End Class 

अगला, आपको एक सत्यापनकर्ता वर्ग को लागू करने की आवश्यकता है। यह वर्ग एमवीसी को क्लाइंट सत्यापन नियमों को जानने के लिए ज़िम्मेदार है जो अविभाज्य सत्यापन पुस्तकालय के लिए काम करने के लिए आवश्यक हैं।

DataAnnotationsModelValidatorProvider.RegisterAdapter(GetType(RequiredIfAttribute), GetType(RequiredIfValidator)) 

यह आपको इस प्रक्रिया का 90% हो जाता है:

Public Class RequiredIfValidator 
    Inherits DataAnnotationsModelValidator(Of RequiredIfAttribute) 

    Public Sub New(metaData As ModelMetadata, context As ControllerContext, attribute As RequiredIfAttribute) 

     MyBase.New(metaData, context, attribute) 

    End Sub 

    Public Overrides Function GetClientValidationRules() As IEnumerable(Of ModelClientValidationRule) 

     Dim rule As New ModelClientValidationRule() With {.ErrorMessage = ErrorMessage, 
                  .ValidationType = "requiredif"} 

     rule.ValidationParameters("dependentproperty") = Attribute.DependentProperty.Replace("."c, HtmlHelper.IdAttributeDotReplacement) 

     Dim first  As Boolean = True 
     Dim arrayString As New StringBuilder() 

     For Each param In Attribute.TargetValues 
      If first Then 
       first = False 
      Else 
       arrayString.Append(",") 
      End If 
      arrayString.Append(param.ToString()) 
     Next 

     rule.ValidationParameters("targetvalues") = arrayString.ToString() 

     Return New ModelClientValidationRule() {rule} 

    End Function 

End Class 

अब आप Global.asax के आवेदन शुरू विधि में सब कुछ रजिस्टर कर सकते हैं।अब तुम सिर्फ और बताने के लिए JQuery मान्य जरूरत एमएस के विनीत सत्यापन परत कैसे अपने नई विशेषताओं को पढ़ने के लिए:

/// <reference path="jquery-1.4.1-vsdoc.js" /> 
/// <reference path="jquery.validate-vsdoc.js" /> 

/* javascript for custom unobtrusive validation 
    ==================================================== */ 

(function ($) { 

    // this adds the custom "requiredif" validator to the jQuery validate plugin 
    $.validator.addMethod('requiredif', 
          function (value, element, params) { 

           // the "value" variable must not be empty if the dependent value matches 
           // one of the target values 
           var dependentVal = $('#' + params['dependentProperty']).val().trim().toLowerCase(); 
           var targetValues = params['targetValues'].split(','); 

           // loop through all target values 
           for (i = 0; i < targetValues.length; i++) { 
            if (dependentVal == targetValues[i].toLowerCase()) { 
             return $.trim(value).length > 0; 
            } 
           } 

           return true; 
          }, 
          'not used'); 

    // this tells the MS unobtrusive validation layer how to read the 
    // HTML 5 attributes that are output for the custom "requiredif" validator 
    $.validator.unobtrusive.adapters.add('requiredif', ['dependentProperty', 'targetValues'], function (options) { 

     options.rules['requiredif'] = options.params; 
     if (options.message) { 
      options.messages['requiredif'] = options.message; 
     } 

    }); 

} (jQuery)); 

आशा इस मदद करता है, यह एक असली दर्द काम कर पाने के लिए किया गया था।

+0

अच्छी व्याख्या, इसे शुरू करने से समझने में – CRice

+0

धन्यवाद, @CRice। उम्मीद है कि यह किसी और की मदद करता है। मैं इस तरह कुछ के लिए मारा होगा जबकि एमवीसी 3 बीटा में था, लेकिन यह सब बिट्स और टुकड़ों में था। –

+0

@ शियाडैनियल "दुर्भाग्य से मेरा कोड वीबी.नेट में है क्योंकि मुझे काम पर इसका उपयोग करना है।" एक नई नौकरी के लिए पर्याप्त कारण है! – Elisabeth

3

स्कॉटगु ने आज सुबह ट्वीट किया कि कैसे अगले 48 घंटों के लिए Pluralsight MVC 3 training मुक्त है। उनके पास एक वीडियो है जो दिखाता है कि इस तरह के कस्टम सत्यापन कैसे करें। प्रासंगिक वीडियो 'एएसपी.नेट एमवीसी 3.0 में मॉडल', विशेष रूप से 'कस्टम सत्यापन गुण' और 'स्वयं-सत्यापन मॉडल' के अंतर्गत हैं।

+0

ग्रेट वीडियो। और शानदार विपणन उन्हें दो दिनों के लिए दूर देने के लिए। –

+0

+1 ग्रेट वीडियो। मैंने अभी निशुल्क परीक्षण के लिए पंजीकरण किया है और "कस्टम क्लाइंट सत्यापन" देखा है। यह बहुत अच्छी तरह से था और मदद की है। मैं अब 10 दिन के परीक्षण पर हूं और इसे खत्म होने से पहले कुछ और देख सकता हूं। वे एक अच्छी सेवा प्रदान करते हैं। – Aaron

0

मुझे लगता है कि आपकी समस्या का हल MVC

जटिल तर्क आप अपने खुद के तर्क को लागू कर सकते हैं के लिए में System.ComponentModel.DataAnnotations है। यह बहुत आसान है। सुनिश्चित करें कि आप मॉडल क्लास से आबद्ध और संपत्तियों की चोटी पर विशेषता जोड़ने देखें ... तरह

public class CustomerSearchDE 
{ 
    [StringLength(2, ErrorMessageResourceType = typeof(Translation), ErrorMessageResourceName = MessageConstants.conCompanyNumberMaxLength)] 
    public string CompanyNumber { get; set; } 
} 

देखें http://msdn.microsoft.com/en-us/library/cc668224.aspx

बुनियादी बात के लिए दृढ़ता से इस वर्ग के साथ टाइप करें: इस लिंक पर अनुकूलित करने के लिए एक नज़र

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