2012-08-10 29 views
5

Web APIのグローバルvaldiation属性を作成したかったのですが、だから私はtutorialに続き、次の属性になってしまった:ASP.NET MVC 4 RC Web API ModelStateエラー(null可能なオプションのURLパラメータ)

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

それは私の行動のほとんどで素晴らしい作品:

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にこれを追加しましたオプションおよびnull可能なリクエストパラメータを持つアクションでは期待通りには動作しません。例えば

:私はルート作成

そして内のアクションは、私の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)); 
} 

私はこのURLを要求: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." 
} 
] 

これらのパラメータはオプションでもnullでもかまいませんので、検証エラーとして表示されるべきではないと思います。

誰にもこの問題が発生して解決策が見つかりましたか?

答えて

2

は、あなたがWeb APIとMVCとの間にあなたのコードをめちゃめちゃに見える、あなたの代わりにのウェブAPIからRouteParameterを使用する必要がありますUrlParameter MVC

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

しかしから:

あなたのデフォルトパラメータ経路をスキップテイクはルートテンプレートではなくクエリ文字列で使用するため、ルートメカニズムには何の役割も果たしません。だから、ほとんどの是正ルートは次のようになります。

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

良い点が、まだそれは問題を解決しませんここに。両方のパラメータが「必須」で、ModelStateディクショナリにエラーがあります。アクションパラメータを必須ではないとマークする方法について知っていますか? –

+0

コードでこのソリューションを試しましたか? –

+0

あなたの質問については、オプションのパラメータを使用してください –

4

ます。また、GETリクエストでプリミティブ型の/抑制モデルの検証を回避したいことがあり...

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

あなたは精緻化できますか? –