質問

ASP.NET MVC で検証を実装する方法については、非常に優れた投稿と説明がたくさんありますが、私はそのうちの 1 つを好みます。

ただし、私は jquery $.ajax メソッド経由で ActionMethods を呼び出すのが本当に好きです。$.ajax を使用したい理由の 1 つは、$.ajax 呼び出しを介してページに動的に読み込まれる多くの部分ビュー (エンティティ作成用のフォームも含む) があり、単にビューを返すことができないためです。動的にロードされたコンテンツはすべて失われます。

この問題をよりよく理解できるように、コントローラーのアクションを呼び出してクライアントの jquery コードで応答を処理する方法を説明する簡単なコードをいくつか投稿します。

コントローラーの ActionMethod:

    public ActionResult CreateCustomer(string name, string accountNumber)
    {
        try
        {
            CustomerService.InsertCustomer(name, accountNumber);

            return Json(new ActionInfo()
            {
                Success = true,
                Message = "Customer Is Successfully Created"
            });

        }
        catch (Exception ex)
        {
            return Json(new ActionInfo()
            {
                Success = false,
                Message = ex.Message
            });
        }
    }

クライアント コードでの呼び出しと処理:

$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {

    if (response.Success)
        alert("Success: " + response.Message);
    else
        alert("Error: " + response.Message);
}});

これらの検証フレームワークの一部を必要に応じて機能させる良い方法はありますか? ActionInfo に検証エラーを追加して、クライアントでそれを処理できることはわかっていますが、それはすでに 1 つの検証の構築になっていると思います。

役に立ちましたか?

解決

私は、データ注釈属性を使用してAJAXを経由して検証を行って大きな成功を収めています。あなたのデータの妥当性をチェックするためには、それ自身と呼ばれるModelStateの性質を持っているコントローラのIsValidプロパティを、使用することをお勧めします。私は強くhref="http://www.asp.net/learn/mvc/tutorial-39-cs.aspx" rel="noreferrer">データ注釈検証はチュートリアルの属性

まず最初に、あなたではなく別の名前と口座番号よりも、パラメータとしてモデルオブジェクトを受け入れるようにコントローラのアクションを変更したいと思うでしょう。これは私が、以下のはるかに簡単デモンストレーションを行います検証を実行するようになります。あなたの例からは、私の最高の推測では、あなたのモデルオブジェクトがある、または、顧客と呼ばれるだろうということです。あなたは、次のモデルオブジェクトを定義するためのコードとコントローラのアクションを持っているかもしれません...

// model object
public class Customer
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  public String AccountNumber {get; set;}
}

// controller
public class CustomerController : Controller
{
  public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
  {
     // controller action code
  }
}


フォームフィールドはASP.NET MVCは自動的にそれらをバインドすることができますので、Customerオブジェクトのプロパティの名前と一致する名前が付けられていることを確認してください。 「バインド」属性は、この場合には、プロパティをモデル化するために、フォームフィールドをバインドする際に、Customerクラスの「ID」プロパティを無視するようにASP.NET MVCを語っています。これは新しい顧客であるので、我々はまだIDを持っていないので、私たちは安全であるものは何でもデフォルト値として同上のままにし、それを生成するために最善の方法を把握するために、データ層を残すことができます。

コントローラは、アクションメソッドのモデルオブジェクトを構築した後、

、その妥当性を容易ModelState.IsValidプロパティを介して確認することができます。 1が予想されるように1つのまたは複数のプロパティが無効である場合にはモデルプロパティが有効、または偽であるならば、それはtrueを返します。

元の質問から、検証が失敗したときCustomerService.InsertCustomerメソッドは例外を投げているように見えます。これは完全に不要です。 InsertCustomerは新しいレコードを挿入するために必要なあらゆるデータ操作を実行する必要があるはずです。あなたがSqlExceptionがのような抽象実装特定の例外に希望がない限り、InsertCustomerは本当にすべての例外をキャッチまたはスローする必要はありませんが、最も可能性が高いだけでコントローラ(または誰でも、呼び出し元がかもしれない)までの任意の例外バブルを聞かせすることができます。

このすべての最終結果は、次のようなコントローラのアクションを次のようになります。

public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
{
  // model is invalid
  if (!ModelState.IsValid)
  {
    return Json(new ActionInfo()
    {
      Success = false,
      Message = "Validation failed" // you will probably want a more robust message :-)
    });
  }

  // service method accepts a Customer object rather than arbitrary strings  
  CustomerService.InsertCustomer(customer);

  return Json(new ActionInfo()
  {
    Success = true,
    Message = "Customer created successfully."
  });

}


データベース関連の例外のように、予期しないエラーを報告したい場合は、

は、その後、あなたは確かにInsertCustomerへの呼び出しの周りにtry / catchブロックを追加し、クライアントにエラーメッセージを表示するのに必要な結果を返すことができます。

他のヒント

あなたの質問をしてきましたが、私は、Ajaxを使用してサーバー側の検証は、私の<のhref = "http://erraticdev.blogspot.com/2010/11/handlingに呼び出して紹介してきた。これは一年以上後に-validation・エラー・オン・ajax.htmlあなたに多くの関心とすることができる」のrel = 『nofollowを』>ブログ記事で。私はあなたが成功したHTTP呼び出しとして失敗した結果を返すことがわかります。私は(私は$.ajaxsuccesserror応答機能の能力を持っているので、それがより正確だと思う)異なっこれを扱ってきました。そして、あなたの特定の例は、私は私のブログの記事で説明した機能を用いて実施することもできる完璧な例です。

基本的には代わりに、常に正常な応答を返す(ただし、サーバー側の処理が失敗したことをクライアントに伝えるために設定されたプロパティを持つ)私はむしろ、サーバー上execeptionを投げると、クライアント上でそれに応じて扱います。私はHandleModelStateExceptionアクションフィルタと一緒にカスタムModelStateExceptionクラスを使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top