asp.net-mvc - CustomValidation属性がASP.NET MVC 3およびEFで機能しない

asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4 entity-framework-4.1

カスタム検証属性の作成方法を理解しました。実際、Seedメソッドを使用してデータベースに事前入力すると、Validateメソッドが実行され、失敗すると例外がスローされます。
ただし、検証はエンティティの作成フォームでは機能しません。

何かをHTML(Razorフォーム)に変更する必要がありますか?

検証に失敗したアイテムを追加できます。

ここにコード:

namespace Data.Model
{
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    sealed public class YearsValidationAttribute : ValidationAttribute
    {
        // Internal field to hold the min value.
        readonly int _years;

        public int Years
        {
            get { return _years; }
        }

        public YearsValidationAttribute(int years)
        {
            _years = years;
        }


        public override bool IsValid(object value)
        {
            var years = (int)value;
            bool result = true;
            if (this.Years != null)
            {
                result = Years >= years;
            }
            return result;
        }



        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture,
              ErrorMessageString, name, Years);
        }
    }
}


public class Position
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]   
        public int PositionID { get; set; }

        [Required(ErrorMessage = "Position name is required.")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
        [Display(Name = "Position name")]              
        public string name { get; set; }

        [Required(ErrorMessage = "Number of years is required")] 
        [Display(Name = "Number of years")]
        [YearsValidationAttribute(5, ErrorMessage = "{0} value must be greater than {1} years.")]        
        public int yearsExperienceRequired { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }



@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Position</legend>

        @Html.HiddenFor(model => model.PositionID)

        <div class="editor-label">
            @Html.LabelFor(model => model.name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.name)
            @Html.ValidationMessageFor(model => model.name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.yearsExperienceRequired)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.yearsExperienceRequired)
            @Html.ValidationMessageFor(model => model.yearsExperienceRequired)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
答え
あなたがあなたに与えたそのコードはあなたにクライアントバリデーターを与えません、サーバーサイドだけです。しかし、それは良い出発点です。サーバーのアクションメソッドで行う必要があるのは、モデルが次のように有効かどうかを確認することです。

public ActionResult YourAction(YourModel model)
{
    if(ModelState.IsValid)
    {
        // Do your save
    }
    else
    {
        // Do your other stuff
    }
}


クライアント側の検証も必要な場合は、ここのリソースを使用できます:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

Remote検証属性を使用することもできます:http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx
関連記事

c# - ResourceManagerの変更(更新可能にする)

jquery - MVCコントローラーへの投稿でjquery読み取り専用テキストボックスが表示されない

asp.net - クレジットカードによる名前の確認[終了]

asp.net-mvc - エリアを使用したASP.NET MVCルーティング

asp.net - 誰かがこれらのASP.NET MVCコントローラーActionResultsのDRY化を手伝ってくれる?

asp.net-mvc - Html.ActionLinkがルート値を自動的に追加しないようにする

jquery - 入力後に入力テキストを非表示、入力後にパスワードを非表示

asp.net-mvc - 子オブジェクトのコレクションを含むMVC3オブジェクト

asp.net-mvc - TagBuilderで属性値のHTMLエンコードを無効にする

c# - ASP.NET MVCモデルを再利用可能なアセンブリとしてカプセル化する