2012-11-29 20 views
21

मैं एक वेब एपीआई पोस्ट कार्रवाईवेब एपीआई नल आवश्यक संपत्ति DataMember विशेषता

public class ViewModel 
{ 
    public string Name { get; set; } 

    [Required] 
    public int? Street { get; set; } 
} 

पर निम्नलिखित वीएम प्राप्त कर रहा मैं एक पोस्ट मैं निम्नलिखित त्रुटि मिलती है बनाने की आवश्यकता है जब त्रुटि स्पष्ट है इसलिए मैं पूरी तरह से यह सुनिश्चित करना चाहता हूं कि जब आपके पास आवश्यक शून्य गुणों वाले वर्ग हों तो [DataContract] और [DataMember] विशेषताओं का उपयोग करना आवश्यक है।

क्या वेब एपीआई में इन विशेषताओं का उपयोग करने से बचने का कोई तरीका है?

उत्तर

20

मैं तुम्हें रूप में एक ही समस्या का सामना कर रहा हूँ, और मुझे लगता है कि यह पूरी तरह से बकवास है। मूल्य प्रकारों के साथ मैं देख सकता हूं कि [Required] काम नहीं करता है क्योंकि मान-टाइप की गई संपत्ति शून्य नहीं हो सकती है, लेकिन जब आपके पास एक शून्य मूल्य मान है तो कोई समस्या नहीं होनी चाहिए। हालांकि, वेब एपीआई मॉडल सत्यापन तर्क समान रूप से गैर-शून्य और शून्य मूल्य प्रकारों का इलाज करता प्रतीत होता है, इसलिए आपको इसके आसपास काम करना होगा। मैं एक काम के आसपास Web API forum में पाया जाता है और इस बात की पुष्टि कर सकते हैं कि यह काम करता है: एक ValidationAttribute उपवर्ग बनाएँ और नल मूल्य टाइप गुणों पर RequiredAttribute की यह बजाय लागू होते हैं:

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

public class NullableRequiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    public bool AllowEmptyStrings { get; set; } 

    public NullableRequiredAttribute() 
     : base("The {0} field is required.") 
    { 
     AllowEmptyStrings = false; 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return false; 

     if (value is string && !this.AllowEmptyStrings) 
     { 
      return !string.IsNullOrWhiteSpace(value as string); 
     } 

     return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName)); 
     yield return modelClientValidationRule; 
    } 
} 

उपयोग में NullableRequiredAttribute:

public class Model 
{ 
    [NullableRequired] 
    public int? Id { get; set; } 
} 
+0

यह कुछ समय हो गया है क्योंकि मैंने यह प्रश्न पोस्ट किया है और असल में मैं जो सुझाव देता हूं, वह कर रहा हूं, मुझे अभी भी समझ में नहीं आ रहा है कि क्यों वेब एपीआई इस तरह से काम करता है – jorgehmv

+3

@jorgehmv मैं इसे एक बग मानता हूं, जब तक कि कोई मुझे अन्यथा विश्वास न करे। – aknuds1

+0

यह वेबएपी 2 रिलीज में अब कोई मुद्दा नहीं है। बग तय किया जा रहा है। अगर कुछ भी मुझे नाराज है कि मुझे व्यूमोडेल विशेषताओं को निरर्थक बनाना होगा जब मैं सही त्रुटि संदेश लौटने के लिए आवश्यक मूल्यों को कम-से-कम कर रहा हूं। –

2

मुझे लगता है कि के रूप में यहाँ पर चर्चा की आप एक ही समस्या में चल रहे हैं:

DataAnnotation for Required property

+0

हाँ मैंने बाद में उसी समाधान को पाया। मेरी राय में यह एक और अधिक सुरुचिपूर्ण तरीका है: अब भी आप डिफ़ॉल्ट आवश्यक सत्यापनकर्ता का उपयोग कर सकते हैं। –

0

यह वेब एपीआई 2 में तय किया गया है। हालांकि, दिलचस्प केवल तभी काम करता है जब फ़ील्ड गुण/सेट के साथ गुण हों।