ASPを作成する.NET Core MVCアプリケーション(6)-検証の追加

4961 ワード

ASPを作成する.NET Core MVCアプリケーション(6)-検証の追加


DRYの原則


DRY(「Don't Repeat Yourself」)はMVCの設計原則の一つである.ASP.NET MVCでは、機能や動作を1回だけ定義し、アプリケーションのあちこちで使用することを奨励します.これにより、作成するコードの量が大幅に減少し、コードのエラーが発生しにくくなり、テストとメンテナンスが容易になります.
MVCとEntity Framework Code Firstが提供する検証機能は、実際の応用におけるDRY原則の良い例である.指定した検証ルールを1つの場所(モデルクラス)で宣言し、アプリケーション全体で有効にすることができます.

Userモデルクラスに検証ルールを追加


DataAnnotationsは、任意のクラスまたは属性に適用できる組み込みの検証プロパティのセットを提供します.(ワードには、検証機能ではなくデータのフォーマットを支援するDataTypeのようなフォーマット機能も含まれています)
組み込まれたRequired,StringLength,RegularExpressionおよびRange検証プロパティを追加します.
public class User
{
    public int ID { get; set; }

    [Display(Name = "  ")]
    [StringLength(10, MinimumLength = 3)]
    [Required]
    public string Name { get; set; }

    [Display(Name = "  ")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Display(Name = "  ")]
    [Required]
    [Range(150, 230)]
    public decimal Height { get; set; }

    [Display(Name = "  ")]
    public string Title { get; set; }

    [Display(Name = "  ")]
    public string Dept { get; set; }

    [Display(Name = "  ")]
    public string Bio { get; set; }
}

ここで、RequiredおよびMinimumLengthAttributeは、属性が空ではないことを示す.ただし、認証条件を満たすためにスペースを入力することはできません.RegularExpressionAttributeは、ユーザーが入力できる文字を制限するために使用されます.RangeAttribute制限値は指定の範囲内でなければなりません.StringLengthAttributeでは、文字列の最大長とオプションの最小長を設定できます.値タイプ(例えばdecimal,int,float,DateTime,[Required])は、自身が必要とし、UserControllerAttributeを必要としない.

検証エラー


エラーのデータを入力すると、jQueryクライアント検証ですぐにエラーが検出され、エラーメッセージが表示されます.注意フォームには、無効なデータを含むフィールドごとに適切な検証エラーメッセージが自動的に表示されます.エラーは、クライアント(JavaScriptとjQueryを使用)とサーバ側で実行されます.
クラスやCreateを修正する必要はありませんcshtmlビューの1行のコードで、UIを検証できます.以前に作成したControllerとビューでは、Userモデルクラスのプロパティで指定した検証プロパティルールが自動的に使用されます.Edit操作方法を使用して検証をテストします.同様に有効になります.

CreateビューとCreateアクションメソッドで、どのようにトリガされたかを検証します。


コントローラやビューを更新せずにUIがどのように生成されたかを検証することに興味があるかもしれません.
// GET: User/Create
public IActionResult Create()
{
    return View();
}

// POST: User/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Create([Bind("ID,Name,Email,Bio,Height,Title,Dept")]User user)
{
    if (ModelState.IsValid)
    {
        _context.Add(user);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(user);
}

最初の(HTTP GET)Createメソッドは、初期のCreateフォームを表示します.2番目のバージョン([HttpPost])は、POST要求の処理を担当し、ModelState.IsValidを呼び出して検証エラーがあるかどうかを確認します.このメソッドを呼び出すと、オブジェクトに適用された検証が検証されます.オブジェクトに検証エラーがある場合は、Createメソッドがフォームを再表示します.エラーがなければ、メソッドはデータベースにデータを保存します.
この例では、クライアント検証でエラーが検出された場合、フォームはサーバにPOSTされません.ブラウザでJSを無効にすると、クライアント検証が無効になります.HTTP POSTCreateメソッドのModelState.IsValidでは、検証エラーが検出されます.Input Tag Helper(Consumem)DataAnnotationsプロパティが使用され、クライアントでjQuery検証に必要なHTMLプロパティが生成されます.Validation Tag Helper検証エラーの表示を担当します.
非常にNiceのは、このスキーマコントローラとビューテンプレートが実際に実行された検証ルールや具体的なエラーメッセージを知る必要がないことです.検証ルールとエラー文字列は、モデルクラスでのみ指定されます.同じルールは、Modelを作成または変更するビューテンプレートに自動的に適用されます.
検証ロジックを変更する場合は、Modelに検証プロパティを1つの場所に追加するだけです.アプリケーションの異なる部分が異なる検証ルールを実行する心配はありません.すべての検証ロジックは同じ場所で定義され、あちこちで使用されます.これは、DRYの原則に十分に従っていることを意味します.

DataType Attributesの使用

System.ComponentModel.DataAnnotationsネーミングスペースには、認証機能以外のフォーマット機能が組み込まれています.例:
[Display(Name = "  ")]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }

[Range(8000, 10000)]
[DataType(DataType.Currency)]
public decimal Salary { get; set; }
DataTypeプロパティは、ビューエンジンがデータをフォーマットするためにのみ使用されます(およびURLにラベルを提供し、Emailにを提供します).RegularExpressionプロパティ検証データのフォーマットを使用できます.DataTypeプロパティは、検証プロパティではなく、データベース自体のタイプよりも特定のデータ型を指定するために使用されます.この例では、特定の時間を必要とせずに日付を追跡するだけです.DataType列挙では、Date、Time、PhoneNumber、Currency、EmailAddressなど、多くのデータ型が提供されています.DataTypeプロパティは、アプリケーションに特定のデータ型のフィーチャーを自動的に提供させることができる.例えば、DataType.EmailAddressmailto:リンクを作成することができ、DataType.Dateはブラウザに日付セレクタを提供することができる.DataTypeプロパティは、HTML 5ブラウザでサポートされているHTML 5data-プロパティを生成します.DataType検証は提供されません.DataType.Date指定された日付の表示形式ではありません.デフォルトでは、データフィールドのデフォルトの表示フォーマットは、サーバのCultureInfo設定に基づいて決定されます.

個人ブログ


私のブログ