2017-03-03 1 views
2

私は自分のWeb APIのために多くのモデルをセットアップしていますが、どれもそれらに対する属性はありません。ここでは、簡単なコントローラの例は、すべてのコントローラのnullモデルを処理する方法aspnet core c#

public async Task<IActionResult> PutAsync([FromBody] ChartModel model) 
{ 
    .... 
} 

ある今、ユーザは、例えば、モデル内の無効なデータ・タイプをアップロードしようとすると、数プロパティに種類の手紙は、その後、私のコントローラはヌルrecieves。

これを処理する最も簡単で簡単な方法は何ですか?これらの特定のメソッドでモデルがnullの場合は、BadRequestを返します。

それぞれの方法に以下のようなものを追加できます。

if (model == null) 
    return new BadRequestObject("Invalid model"); 

しかし、私は私がやるとクリーンで整然とであることができる何かがなければならないと確信して、私はちょうどあなたがこの

public class ValidateModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var modelState = actionContext.ModelState; 

     if (!modelState.IsValid) 
     { 
      actionContext.Response = actionContext.Request.CreateErrorResponse(
       HttpStatusCode.NotAcceptable, modelState); 
     } 
    } 
} 

してから使用してのようなものを何ができるか

+2

任意のモデル誤差がModelState'が[にModelState](https://www.exceptionnotfound.net/asp-net-mvc-demystified-modelstateについての詳細を読んで、 'に追加されている場合は、' ModelState.IsValid'がわかります/) – Curiousdev

+0

あなたのモデルに何らかの属性が設定されていない場合でも、 – Gillardo

+0

他に何もない場合は、グローバルアクションフィルターでそれを行うことができます:) – juunas

答えて

3

知りませんそれはあなたのコントローラのメソッドの上にあります

[ValidateModel] 
public async Task<IActionResult> PutAsync([FromBody] ChartModel model) 
{ 
    // your code goes here 
} 

あなたはコードiで毎回チェックする必要はありませんf ModelStateが有効かどうか。

0

途中でActionFilter属性を実装し、メソッドの実行前にチェックを行い、無効なパラメータがあればエラー応答を返します。

たとえば、この(.NET 4.5コード!)は、ANYを見つけたらBadRequestを返します!パラメータはnullです。

public class ParamCheck : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     var args = actionContext.ActionArguments; 
     if (args.Any(arg => arg.Value == null)) 
      actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Null params"); 
     else 
      base.OnActionExecuting(actionContext); 
    } 
} 

次に、ActionFilterを使用してメソッドをデコレートするか、グローバルに登録してください。

[HttpGet] 
    [ParamCheck] 
    public HttpResponseMessage Test(SummarySyncParams pars) 
    {} 
関連する問題