2

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

何かをHTML(Razor Form)に変更する必要がありますか?

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

コード:

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> 
} 

答えて

2

あなたはあなたのクライアントバリ、サーバー側のみを与えることはありません持っていることのコード。しかしそれは良い出発点です。あなたは、サーバー上のアクションメソッドで行う必要があり、モデルは、そのようなような有効であるかどうかを確認することです。

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

+0

実際にここに貼り付けたコードはすでにありました。問題は後方検証を行っていたことでしたが、変更して動作します。また、テキストボックスの隣に検証メッセージが表示されます。しかし、私はクライアント側の検証も試みます。 –

+1

それはあなたのためにうまくいった。あなたは "検証の裏向き"とはどういう意味ですか? –

+0

結果は= Years> = yearsでした;正しい方法はresult = years> = Yearsでした。 –

関連する問題