2014-07-13 9 views
8

साथ WebAPI enum पैरामीटर मैं एक नियंत्रकAsp.net डिफ़ॉल्ट मान

[HttpGet] 
    [RoutePrefix("api/products/{productId}")] 
    public HttpResponseMessage Products(int productId,TypeEnum ptype=TypeEnum.Clothes) 
{ 
    if(!Enum.IsDefined(typeOf(TypeEnum),ptype)) 
     //throw bad request exception 
    else 
     //continue processing 
} 

Myenum रूप

public TypeEnum 
{ 
    Clothes, 
    Toys, 
    Electronics 
} 

वर्तमान में अगर घोषित किया जाता है है, कुछ कचरा मूल्य पारित हो जाता है यह डिफ़ॉल्ट मान में परिवर्तित हो रही है। मैं क्या करना चाहता हूं कि अगर मैं नियंत्रक को एपीआई/उत्पाद/1 के रूप में कॉल करता हूं तो पीटीपी को डिफॉल्ट वैल्यू यानी कपड़े सौंपा जाना चाहिए। अगर मैं नियंत्रक को एपीआई/उत्पादों/1 के रूप में कॉल करता हूं? PType = somegarbagevalue तो नियंत्रक को खराब अनुरोध अपवाद फेंकना चाहिए। इसे कैसे प्राप्त किया जा सकता है?

उत्तर

6

आपको string के साथ करना है और स्ट्रिंग को Enum मान में कनवर्ट करने के लिए TryParse() का उपयोग करना है।

public HttpResponseMessage Products(int productId,string ptype="Clothes") 
{ 
    TypeEnum category = TypeEnum.Clothes; 
    if(!Enum.TryParse(ptype, true, out category)) 
     //throw bad request exception if you want. but it is fine to pass-through as default Cloathes value. 
    else 
     //continue processing 
} 

यह अनुभवहीन लग सकता है लेकिन इस दृष्टिकोण का लाभ ptype जो कुछ भी स्ट्रिंग के लिए पैरामीटर अनुमति देने के लिए है और जब ptype मूल्य बाध्य करने के लिए विफल रहता है बिना किसी अपवाद के प्रक्रिया को करने के लिए।

13

तारों के रूप में अपने सभी enum मानकों को परिभाषित करना और फिर उन्हें हर जगह को पार्स आप पर हर एक कार्रवाई यह करने के लिए है और आप इस तरह है कि सभी पार्सिंग त्रुटियाँ अनुरूप एक सुसंगत दृष्टिकोण के साथ आने की आवश्यकता होगी मतलब है।

यह पैरामीटर बाध्यकारी समस्या है और इसे नियंत्रक परत में निपटाया नहीं जाना चाहिए, इसे पाइपलाइन में ख्याल रखा जाना चाहिए। ऐसा करने का एक तरीका कस्टम फ़िल्टर बनाना और इसे अपनी कॉन्फ़िगरेशन में जोड़ना है।

public class ModelStateValidationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.ModelState.IsValid) 
     { 
      actionContext.Response = <your standardised error response> 
     } 
    } 
} 

और अपने global.asax.cs में

... 
GlobalConfiguration.Configure(WebApiConfig.Register); 
... 

public class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ... 
     config.Filters.Add(new ModelStateValidationAttribute()); 
     ... 
    } 
} 

आप मॉडल राज्य के साथ समस्या हो रही है, यह प्रकार एक ModelStateDictionary है और आप बस इसे खत्म पुनरावृति और फिर इसे त्रुटियाँ प्रॉपर्टी वाला है सभी मॉडल बाध्यकारी मुद्दों। जैसे

modelState = actionContext.ModelState; 
modelState.ForEach(x => 
     { 
      var state = x.Value; 
      if (state.Errors.Any()) 
      { 
       foreach (var error in state.Errors) 
       { 
        <work your magic> 
       } 
      } 
     }); 
+0

मुझे इस समाधान को काफी समझ में नहीं आता है। प्रश्न से 'TypeEnum' का उपयोग/इलाज का आपका कोड कहां है? मैंने एक [संबंधित प्रश्न] (https://stackoverflow.com/questions/48424564/jsonconverter-equivalent-for-http-get-parameter) से पूछा है जो आपके लिए भी लिंक है। –

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