2016-10-20 12 views
0

必須のフィールドなどを指定するのに有効な組み込みモデル検証を使用しますが、モデルでは2つの列の組み合わせが一意であるようにキー制約を指定しました。ASP.NET MVCのキー制約を検証する方法

これを確認するにはどうすればよいですか?ユーザーが重複を追加しようとすると例外がスローされません。

は、ここに私のモデルである:

public class EmailFilter 
{ 
    public int ID { get; set; } 
    [Required] 
    [StringLength(100)] 
    [Index("IX_FilterAndEmail", 2, IsUnique = true)] 
    public string Email { get; set; } 
    //This is an enum 
    [Required] 
    [Index("IX_FilterAndEmail", 1, IsUnique = true)] 
    public EmailFilterType Filter { get; set; } 
} 

そして、私のコントローラメソッドを作成します。私はエラーを追加しようとしましたが、私はそれを正しくやっていません。それは例外の発生を停止しますが、それは単にリストビューに戻ります。ここで検証する正しい方法は何か分かりません。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "ID,Email,Filter")] EmailFilter emailFilter) 
    { 
     if (ModelState.IsValid) 
     { 
      if(db.EmailFilters.Any(x => x.Filter == emailFilter.Filter && x.Email == emailFilter.Email)) 
      { 
       // This doesn't seem to do anything and returns to listview not create view 
       // "EFValidationSummary" is the id of my validation summary razor control 
       ModelState.AddModelError("EFValidationSummary", "This filter already exists"); 
       return View(emailFilter); 
      } 
      else 
      { 
       db.EmailFilters.Add(emailFilter); 
       db.SaveChanges(); 
      } 

      return RedirectToAction("Index"); 
     } 

     return View(emailFilter); 
    } 

エラーを正しくトリガーし、検証エラーが表示された状態で作成ページに戻すにはどうすればよいですか?

+0

それは 'ModelState.AddModelErrorする必要があります(「」、「このフィルタは、すでに」存在します);' @ Html.ValidationSummary()によって生成された要素に表示するために –

+2

EFエンティティクラスをViewModelとして使用しないでください。 – Dai

+0

@StephenMueckeありがとう!それは働いた – Guerrilla

答えて

0

AddModelError()の最初のパラメータは、モデル内のプロパティの名前です。あなたのケースでは、エラーメッセージが

@Html.ValidationMessageFor(m => EFValidationSummary) 

によって生成されたプレースホルダに表示されますが、あなたのモデルは、EFValidationSummaryという名前のプロパティが含まれていません。 @Html.ValidationSummary()によって生成されたプレースホルダに検証メッセージを表示するには、最初のパラメータに空の文字列を提供する必要が

ModelState.AddModelError("", "This filter already exists"); 
関連する問題