2012-08-10 13 views
5

है, मैं अपने वेब एपीआई के लिए वैश्विक वैलडिएशन विशेषता बनाना चाहता था। इसलिए मैं tutorial पीछा किया और निम्न विशेषता के साथ समाप्त हो गया:वैकल्पिक यूआरएल पैरामीटर के लिए एएसपी.नेट एमवीसी 4 आरसी वेब एपीआई मॉडलस्टेट त्रुटि जो शून्य

public class ValidationActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (actionContext.ModelState.IsValid) 
     { 
      return; 
     } 

     var errors = new List<KeyValuePair<string, string>>(); 
     foreach (var key in actionContext.ModelState.Keys.Where(key => 
      actionContext.ModelState[key].Errors.Any())) 
     { 
      errors.AddRange(actionContext.ModelState[key].Errors 
        .Select(er => new KeyValuePair<string, string>(key, er.ErrorMessage))); 
     } 

     actionContext.Response = 
      actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); 
    } 
} 

तो मैं यह Global.asax में वैश्विक fitlers को जोड़ा गया:

configuration.Filters.Add(new ValidationActionFilter());

यह अपने कार्यों से अधिकांश के साथ अच्छा काम करता है लेकिन उन कार्रवाइयों के साथ अपेक्षित नहीं है जिनके पास वैकल्पिक और निरर्थक अनुरोध पैरामीटर हैं।

उदाहरण के लिए:

मैं एक मार्ग बनाया:

और में एक कार्रवाई मेरी ProductsController:

public HttpResponseMessage GetAllProducts(int? skip, int? take) 
{ 
    var products = this._productService.GetProducts(skip, take, MaxTake); 

    return this.Request.CreateResponse(HttpStatusCode.OK, this._backwardMapper.Map(products)); 
} 

अब मैं इस यूआरएल का अनुरोध करते हैं: http://locahost/api/products मैं एक प्रतिक्रिया मिल 403 स्टेटस कोड और निम्न सामग्री के साथ:

[ 
{ 
    "Key": "skip.Nullable`1", 
    "Value": "A value is required but was not present in the request." 
}, 
{ 
    "Key": "take.Nullable`1", 
    "Value": "A value is required but was not present in the request." 
} 
] 

मेरा मानना ​​है कि यह सत्यापन त्रुटि के रूप में प्रकट नहीं होना चाहिए क्योंकि ये पैरामीटर वैकल्पिक और शून्य दोनों हैं।

क्या किसी को भी इस समस्या का सामना करना पड़ा है और समाधान मिला है?

उत्तर

2

लगते आप वेब एपीआई और MVC के बीच अपने कोड में गड़बड़ है, तुम

routes.MapHttpRoute(
    name: "Optional parameters route", 
    routeTemplate: "api/{controller}", 
    defaults: new { skip = RouteParameter.Optional, take = RouteParameter.Optional } 
    ); 

लेकिन MVC

से वेब एपीआई के बजाय UrlParameter से RouteParameter उपयोग करना चाहिए:

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

routes.MapHttpRoute(
    name: "Optional parameters route", 
    routeTemplate: "api/{controller}" 
    ); 
+1

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

+0

क्या आपने इस कोड को अपने कोड में आजमाया है? –

+0

अपने प्रश्न के लिए, वैकल्पिक पैरामीटर का उपयोग करें –

4

तुम भी से बचने के लिए GET अनुरोध में आदिम प्रकार के लिए/दबाने मॉडल मान्यता चाहते हो सकता है ..

public class ModelValidationFilter : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      if (!actionContext.ModelState.IsValid && actionContext.Request.Method != HttpMethod.Get) 
      { ... 
+0

क्या आप विस्तृत कर सकते हैं? –

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