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
およびMinimumLength
Attributeは、属性が空ではないことを示す.ただし、認証条件を満たすためにスペースを入力することはできません.RegularExpression
Attributeは、ユーザーが入力できる文字を制限するために使用されます.Range
Attribute制限値は指定の範囲内でなければなりません.StringLength
Attributeでは、文字列の最大長とオプションの最小長を設定できます.値タイプ(例えばdecimal
,int
,float
,DateTime
,[Required]
)は、自身が必要とし、UserController
Attributeを必要としない.
検証エラー
エラーのデータを入力すると、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.EmailAddress
はmailto:
リンクを作成することができ、DataType.Date
はブラウザに日付セレクタを提供することができる.DataType
プロパティは、HTML 5ブラウザでサポートされているHTML 5data-
プロパティを生成します.DataType
検証は提供されません.DataType.Date
指定された日付の表示形式ではありません.デフォルトでは、データフィールドのデフォルトの表示フォーマットは、サーバのCultureInfo
設定に基づいて決定されます.
個人ブログ
私のブログ
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; }
}
// 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);
}
[Display(Name = " ")]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }
[Range(8000, 10000)]
[DataType(DataType.Currency)]
public decimal Salary { get; set; }