2012-05-11 15 views
2

私はスコット・グーのブログに従っています。hereASP.NET MVC 2:モデル検証 - ユーザー名は既に取得済みですか?

彼のブログでは、彼はクライアントとサーバー側の検証について語ります。

ユーザー名が既に取得されているかどうかを検証し、これを検証エラーメッセージとしてユーザーに表示しますか?スコットのブログで

、これはTitle場合の検証と同じになりユニークです:

public class Dinner 
{ 
    public int DinnerID { get; set; } 

    [Required(ErrorMessage = "Please enter a Dinner Title")] 
    [StringLength(20, ErrorMessage = "Title is too long")] 
    public string Title { get; set; } 

    [Required(ErrorMessage = "Please enter the Date of the Dinner")] 
    public DateTime EventDate { get; set; } 

    [Required(ErrorMessage = "Please enter the location of the Dinner")] 
    [StringLength(30, ErrorMessage = "Address is too long")] 
    public string Address { get; set; } 

    [Required(ErrorMessage = "Please enter your email address")] 
    [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")] 
    public string HostedBy { get; set; } 

    public virtual ICollection<RSVP> RSVPs { get; set; } 
} 

私の最初の推測では、何とかこれがこちらのモデルコントローラ、内で行われていることである。

// 
    // POST: /Home/Create 

    [HttpPost] 
    public ActionResult Create(Dinner dinner) 
    { 
     if (ModelState.IsValid) 
     { 
      nerdDinners.Dinners.Add(dinner); 
      nerdDinners.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     return View(dinner); 
    } 

Titleがデータベースサーバーに格納されているため、これはサーバー側の検証になります。それは[Required]または[StringLength()]のような宣言部分を使用しないように

私はTitleが一意であるかどうかを確認する方法を知っているが、私は検証メッセージを作成する方法がわからないがビューに表示されます。例えば、ここで私は、一意性をチェックすることができる方法です。

[HttpPost] 
    public ActionResult Create(Dinner dinner) 
    { 
     if (ModelState.IsValid) 
     { 
      foreach (var existingDinner in nerdDinners.Dinners) 
      { 
       if(existingDinner.Title == dinner.Title) 
       { 
        **// TODO: display validation error message?** 
       } 

      } 

      nerdDinners.Dinners.Add(dinner); 
      nerdDinners.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     return View(dinner); 
    } 

私の想像、及び魔法の杖を使用して、私は他の検証宣言部分のように動作し[TitleIsUnique]と呼ばれる新しい宣言型を作成したいと思います。

ありがとうございました。

+0

組み込みフロントエンド検証応答も使用していますか?もしそうなら(MS oneまたはjQueryのvalidation one?) –

+0

私は宣言のセットである.Net 1を使用しています。彼のブログでは、ScottはSystem.ComponentModel.DataAnnotationsライブラリから来ていると言います。私はこの名前空間を調べ、私が求めていることをする宣言を見つけられませんでした。 – sapbucket

答えて

3

前述のようにカスタム属性を作成し、IValidateObjectを使用することができますが、私のアプリケーションのレイヤーの1つでModelStateにエラーを追加することをお勧めします。あなたがModelState.AddModelError("Title", "Title must be unique");を使用している場合

このためには、それがTitleフィールドにエラーが追加されますModelState.AddModelError

を使用することができます。

ModelState.AddModelError("*", "Title must be unique");を使用すると、ページに一般的なエラーメッセージが追加されます。

[HttpPost] 
    public ActionResult Create(Dinner dinner) 
    { 
     if (ModelState.IsValid) 
     { 
      if(nerdDinners.Dinners.Any(d => d.Title == dinner.Title)) 
      { 
       ModelState.AddModelError("Title", "The title is not unique"); 
       return View(dinner); 
      } 

      nerdDinners.Dinners.Add(dinner); 
      nerdDinners.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     return View(dinner); 
    } 
+0

それは完全に機能しました。まさに私が望んでいたもの。ありがとうございました! – sapbucket

+0

[この質問?](http://stackoverflow.com/questions/10568813/how-to-reference-html-page-from-aspx-page-in-the-same-vs2010-solution)の回答をご存知ですか? ) – sapbucket

+0

@sapbucket私はそこに投稿した私の答えに間違っていましたか? –

0

おそらく、CustomAttributeから派生した独自の属性を実装しようとしています。このブログ記事http://blogs.msdn.com/b/adonet/archive/2011/05/27/ef-4-1-validation.aspxを見てください - 一意性を検証する方法を示しています。ポストではIValidatableObjectインターフェイスを使用して検証を実行しますが、CustomAttributeを作成することで同じことができるはずです。

関連する問題