[翻訳]ASP.NET MVC 3が開発した20の秘訣(3)[20 Recipes for Programming MVC 3]:ユーザー入力の検証

12129 ワード

議題
フォームに入力された内容がデータベースとモデル設計のタイプに一致することを保証するために、設計時に検証を追加します.
ソリューション
はい.NET 4.0のMVC 3には、新しいネーミングスペースDataAnnotationsが含まれており、多くの有用なメタデータ属性が提供されています.フォームの入力を検証するには、次の属性クラスでは、RequireAttribute、RegularExpressionAttribute、DataTypeAttributeなど、さまざまな検証方法を提供します.入力しなければならない内容を定義する必要がある場合、MVC 3は開発者が改善されたValidationAttributeクラスを通じて検証を定義することをサポートする.
 
ディスカッション
以前のコード優先の秘訣でBookモデルを作成し、次の更新を行います.
  • 書名を入力します.
  • ISBDを入力して検証する.
  • 書籍の概要を入力します.
  • 書籍の著者を入力します.
  • 書籍の価格(ドル)を入力し、検証します.
  • 出版時間を入力して検証します. 

  • 6つの入力項目のうち5つの検証はMVC 3の組み込み検証方法でカスタマイズできる.しかし、ISBNのフォーマットには異なる検証方法が必要です.カスタム検証方法:
    using System;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations;
    using MvcApplication4.Validations;

    namespace MvcApplication4.Models
    {
    public class Book
    {
    public int ID { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    [IsbnValidation]
    public string Isbn { get; set; }

    [Required]
    public string Summary { get; set; }

    [Required]
    public string Author { get; set; }

    public string Thumbnail { get; set; }

    [Range(1, 100)]
    public double Price { get; set; }

    [DataType(DataType.Date)]
    [Required]
    public DateTime Published { get; set; }
    }

    public class BookDBContext : DbContext
    {
    public DbSet<Book> Books { get; set; }
    }

    }

     
    上記の例では、[Require]プロパティによって、ユーザーがフィールドを入力する必要があることを識別します.IsbnValidationAttributeクラスにIsValid属性を追加し、操作時にMVC 3呼び出しを通知する必要があります.価格を検証するために、Priceフィールドに[Range]クラスを追加し、[RegularExpression]プロパティを次のように設定します.
            [Range(1, 100)]
    [RegularExpression(@"(\b[\d\.]*)")]
    public double Price { get; set; }

     
    最後に、DataType属性を定義してMVCに、publishedメンバータイプが時間タイプであることを伝える.現在のIsbnValidationクラスでは、認証時にエラーは表示されません.次に、それを実装します.
    ISBNの有効長は10〜13文字である.より良い組織コードのために、カスタム検証コードおよびその他の検証コードファイルを別のフォルダに保存します.アイテムを右クリックし、「追加」->「新規フォルダ」を選択し、フォルダの名前を「Validations」に変更します.次に「追加」->「クラス」を選択し、「IsbnValidationAttribute.cs」、このクラスはValidationAttributeクラスを継承し、IsValidメソッドを書き換えて入力されたISBNの内容を検証します.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text.RegularExpressions;

    namespace MvcApplication4.Validations
    {
    [AttributeUsage(AttributeTargets.Field |
    AttributeTargets.Property, AllowMultiple = false,
    Inherited = true)]
    public class IsbnValidationAttribute :
    System.ComponentModel.DataAnnotations.ValidationAttribute
    {
    /**
    * This class is courtesy:
    *
    http://www.java2s.com/Open-Source/CSharp/
    * Inversion-of-Control-Dependency-Injection/Spring.net/
    * Spring/Validation/Validators/ISBNValidator.cs.htm
    *
    * This class is used for demonstration purposes
    * of performing an ISBN validation. Should you
    * wish to use this in your project, please
    * consult the license agreement here:
    *
    http://www.apache.org/licenses/LICENSE-2.0
    *
    */

    private static readonly String SEP = "(?:\\-|\\s)";
    private static readonly String GROUP = "(\\d{1,5})";
    private static readonly String PUBLISHER = "(\\d{1,7})";
    private static readonly String TITLE = "(\\d{1,6})";



    static readonly String ISBN10_PATTERN =
    "^(?:(\\d{9}[0-9X])|(?:" + GROUP + SEP + PUBLISHER +
    SEP + TITLE + SEP + "([0-9X])))$";

    static readonly String ISBN13_PATTERN =
    "^(978|979)(?:(\\d{10})|(?:" + SEP + GROUP + SEP +
    PUBLISHER + SEP + TITLE + SEP + "([0-9])))$";

    public IsbnValidationAttribute() :
    base("Invalid ISBN number")
    {

    }

    public override bool IsValid(object value)
    {
    // Convert to string and fix up the ISBN
    string isbn = value.ToString();

    string code = (isbn == null)
    ? null :
    isbn.Trim().Replace("-", "").Replace(" ", "");

    // check the length
    if ((code == null) || (code.Length < 10
    || code.Length > 13))
    {
    return false;
    }

    // validate/reformat using regular expression
    Match match;

    String pattern;

    if (code.Length == 10)
    {
    pattern = ISBN10_PATTERN;
    }
    else
    {
    pattern = ISBN13_PATTERN;
    }

    match = Regex.Match(code, pattern);

    return match.Success && match.Index == 0 &&
    match.Length == code.Length;
    }
    }
    }

    上記の例は、C#オープンソースの例がISBN標準検証プログラムを含むものである.IsValidメソッドは2つの検証ルールに一致し、パスするとTrueが返されます.そうしないとFalseが返され、ユーザーに再入力が要求されます. 
     
    書籍作成ページにアクセスしてコミットすると、すべての入力項目が正しいデータを入力するまで、上記のエラーメッセージが表示されます.この検出が通るか否かはModelStateを判断する.IsValid属性がTrueであるかどうか.
     
    リファレンス情報
    DataAnnotations Namespace 原書の住所 ブックソース