2016-09-28 7 views
1

にパラメータを必要とします。 (潜在的に「グローバル」)これをencapsulteする方法はどのように/必要とするアクションのためのパラメータを検証するためにどのようにasp.netアクション

public ActionResult DoSomething(string paramA, string paramB, string paramC) 
{ 
    if (string.IsNullOrWhiteSpace(paramA)) 
    { 
     return JsonResult(false, "paramA is missing"); 
    } 

    if (string.IsNullOrWhiteSpace(paramB)) 
    { 
     return JsonResult(false, "paramB is missing"); 
    } 

    if (string.IsNullOrWhiteSpace(paramC)) 
    { 
     return JsonResult(false, "paramC is missing"); 
    } 

    //Actual Code 
} 

:今、私はこの(恐ろしいです)のように見える行動の多くを持っていますか? 〜1 https://stackoverflow.com/a/39538103/766304 が同じ場所に一歩前進かもしれないですが、一般的に、私はそれがどこでもモデル(すべてのパラメータをラップするのは現実的だということではない操作を行います。私は、モデルと、このポストのようModelState.IsValidを使用するようにパラメータをラップするために、その可能ということを知っています1アクションメソッドあたりのクラス定義...それはどれくらいいいですか?)。

また、これはどこかに、集中処理しなければならないアクション式典ごとに再びです:それを行うための最も簡単な方法は、モデルクラスを作成することや、このような[Required]属性使用することになり

if (ModelState.IsValid == false) 
{ 
    return BadRequest(ModelState); 
} 
+0

を発見した場合は、いくつかのビジネスの検証を行い、エラーコードを返すようにコントローラのアクションや、あなたのビジネスドメインサービスでASP.NET MVC内でモデルを検証し、エラーバックを返すための方法がたくさんあります。あなたが助けが必要な特定のものはありますか? – Luke

+0

聞いてよかったです。いくつかの例文/キーワード/リンクをアクションごとではない方法で与えることができますか? – user766304

+0

「リクエストの検証」をグーグルで実行すると、HTMLを含む文字列パラメータのように、潜在的に危険なコンテンツに対してリクエストを検証することについて多くのことがありますが、そうではありません。別の言葉で私の質問:私は要求を一致させる方法とアクションメソッドを呼び出す方法をカスタマイズする方法を探しています。 – user766304

答えて

4

public class FooModel 
{ 
    [Required] 
    public string ParamA {get;set;} 
    [Required] 
    public string ParamB {get;set;} 
    [Required] 
    public string ParamC {get;set;} 
} 

そして、このようなあなたのコントローラでそれを使用します。

public ActionResult DoSomething(FooModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // return some errors based on ModelState 
    } 

    //Actual Code 
} 

あなたはよりグローバルなアプローチを探しているならば、私はあなたが(自分カントーことを使用していない)アクションフィルタを調べてフィルタをOnActionExecuting使用し、そこに検証を扱うことができると信じています。ここ はそれを行う方法です: How can I centralize modelstate validation in asp.net mvc using action filters? パラメータのいずれかが欠落していた場合、あなたのメソッドが呼び出されることはありませんでしょうその方法。

+0

これは非モデルパラメータの問題を解決することはできませんが、ModelStateをActionFilterからチェックすることは良いアイデアですので+1してください。 – user766304

+0

あなたはいつでもあなたのモデルに必要なプロパティを追加し、それらのために別の属性を追加したり、プロパティやクラス全体のカスタネットを書き込んだりすることもできます。 –

0

[必須] [長さ]とこれらすべての属性を持つモデル注釈は、モデルを検証する最も一般的な方法の1つで、特にRazor Viewエンジンと統合してJavaScript検証も生成します。バックエンドでEntityFrameworkを使用しているので、UI、コントローラ、データアクセスのレベルで検証が行われます。あなたはまた、上記のいずれもまだ十分でない場合、あなたは良い方法https://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx

にあなたの方法のための事前および事後条件を置くことを可能にするコードコントラクトを使用することができます

、あなたはどちらか自分の中でいくつかのチェックを追加することができます何らかのエラーが

+0

コード契約はいくつかのバリデーションを行うためのよりクリーンな方法かもしれませんが、これらのことが_Globally_パラメータの欠落問題の解決にどのように役立つかわかりません。 – user766304

+0

パラメータに値が必要な場合は、例外がスローされ、コードは実行されません。 もう1つのアプローチは、ルーティング制約を使用することです。これは、パラメータが存在しない場合にアクションが呼び出されないようにします –

関連する問題