2013-06-21 6 views
11

मैं एक वेब एपीआई आरईएसटी कमांड पर एक इनपुट को प्रमाणित करना चाहता हूं। मैं इसे State जैसे कुछ काम करने के लिए पैरामीटर के मान्य मानों को सीमित करने वाली विशेषता के साथ सजाए जाने के लिए कुछ करना चाहता हूं।स्वीकृत मानों की सूची के खिलाफ स्ट्रिंग की जांच करने के लिए वेब एपीआई कस्टम सत्यापन

public class Item { 
    ... 

    // I want State to only be one of "New", "Used", or "Unknown" 
    [Required] 
    [ValidValues({"New", "Used", "Unknown"})] 
    public string State { get; set; } 

    [Required] 
    public string Description { get; set; } 

    ... 
} 

क्या वेब एपीआई के अनाज के बिना इसे करने का कोई तरीका है। आदर्श रूप से दृष्टिकोण रेल के custom validation पर रूबी के समान होगा।

उत्तर

22

ValidationAttribute से व्युत्पन्न एक कस्टम सत्यापन विशेषता बनाएं और IsValid सदस्य फ़ंक्शन को ओवरराइड करें।

public class ValidValuesAttribute: ValidationAttribute 
{ 
    string[] _args; 

    public ValidValuesAttribute(params string[] args) 
    { 
    _args = args; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
    if (_args.Contains((string)value)) 
     return ValidationResult.Success; 
    return new ValidationResult("Invalid value."); 
    } 
} 

तो फिर तुम

[ValidValues("New", "Used", "Unknown")] 

ऊपर कोड संकलित नहीं किया गया है या परीक्षण कर सकते हैं।

+2

सुंदर के लिए संकलित या परीक्षण नहीं होने अच्छा । यह न्यूनतम tweaking के साथ काम किया: कन्स्ट्रक्टर 'args' पैरामीटर से पहले' पैराम्स 'पसंद नहीं आया। साथ ही, विशेषता इस तरह दिखती है '[ValidValues ​​(नया [] {"नया", "प्रयुक्त", "अज्ञात"})] ' –

+2

मैंने उपरोक्त कोड संकलित किया। मुझे कन्स्ट्रक्टर सार्वजनिक बनाना था। इसके अलावा, यह उम्मीद के रूप में काम किया। मेरे लिए, 'पैराम्स' काम किया। –

+0

क्या होगा यदि मैं इसे एक हार्डकोडेड सूची पास नहीं करना चाहता हूं? उदाहरण के लिए, मौजूदा सूची का संदर्भ। इसके लिए कोई भी विचार जो अभी भी सिंगलटन या सर्विस लोकेटर की तरह कुछ निर्भरता इंजेक्शन का उपयोग करता है? मुझे लगता है कि यह संभव नहीं है क्योंकि गुण संकलन समय को प्रभावित कर सकते हैं। – crush

1

एपीआई को मूल्य कैसे दिया जाता है? क्या यह एक प्रश्न सर्वो है या यह शरीर में है? मैं आम तौर पर अनुरोध हैंडलर स्तर पर एक चेक करता हूं। यदि आप किसी सूची या सरणी में स्वीकृत मान डालते हैं तो आप केवल Contains एक्सटेंशन विधि का उपयोग कर सकते हैं।

if (validStates.Contains(input)) 
    { 
    return MethodThatProcessesRequest(requiredData); 
    } 
    else 
    { 
    return ErrorHandlingMethod(requiredData); 
    } 

इस प्रकार की सत्यापन सर्वर की तरफ की जानी चाहिए। यूआई पर इनपुट को प्रतिबंधित करने के लिए स्वतंत्र महसूस करें, लेकिन यदि आप एक आरईएसटी एपीआई बना रहे हैं तो इसे के क्लाइंट के बावजूद सभी इनपुट मान्य करना चाहिए।

1

आइटम जो आप मान्य विधि को लागू करने की आवश्यकता होगी के लिए IValidatableObject लागू करें, तो मान्य में जाँच करने के लिए अपनी हालत बारे में है कि क्या यह वैध है, कुछ की तरह:

public IEnumerable<ValidationResult> Validate(ValidationContext context) { 
    if (!States.contains(this.State)){ 
     yield return new ValidationResult("Invalid state.", new[] { "State" }); 
    } 
} 
संबंधित मुद्दे