2

Scott Gu のブログをフォローしています:こちら

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

ユーザー名が既に使用されているかどうかを検証し、これを検証エラー メッセージとしてユーザーに表示するにはどうすればよいですか?

TitleScott のブログでは、これは一意かどうかを検証することと同じです。

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、これはサーバー側の検証になります。

が一意であるかどうかを確認する方法は知っていますが、またはTitleのような宣言を使用する場合のように、検証メッセージをビューに表示する方法がわかりません。たとえば、一意性を確認する方法は次のとおりです。[Required][StringLength()]

    [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]私の想像力と魔法の杖を使って、他の検証宣言と同じように機能する という新しい宣言を作成したいと思います。

よろしくお願いいたします。

4

2 に答える 2

3

前述のようにカスタム属性を作成して使用することもできますがIValidateObject、アプリケーションのレイヤーの 1 つでエラーを ModelState に追加することをお勧めします。

これには、 ModelState.AddModelErrorを使用できます。

使用ModelState.AddModelError("Title", "Title must be unique");すると、フィールドにエラーが追加されTitleます。

これを使用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);
  }
于 2012-05-12T12:20:31.473 に答える
0

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

于 2012-05-12T05:32:39.837 に答える