2011-01-31 13 views
8

これは私がAjaxのPOSTメソッドを呼び出すコントローラのアクションです:ModelStateを更新するには?

[HttpPost] 
    public ActionResult Add(Comment comment) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 

ユーザーはユーザー名と電子メールのフィールドを持っていないフォームを送信し、ログインしている場合ので、彼らはAJAX呼び出しで渡されません。アクションが呼び出されると、ModelStat.IsValidはこれらの2つのプロパティが必要であるためfalseを返します。有効な値をプロパティに設定したら、ModelStateを更新するためにモデル検証をどのように起動するのですか?

答えて

4

あなたはUser.Identityからのコメントのユーザー名と電子メールのプロパティをバインドするためのカスタムmodel binderを使用することができます。バインディングは検証前に発生するため、ModelStateは有効です。

もう1つの方法は、の検証済みユーザーを確認するCommentクラス用のカスタムmodel validatorを実装することです。

これらのオプションを実装することで、最初のifチェックを削除できます。

+0

私はそれが起こるのを恐れていました。他の解決策? – frennky

+1

恐れてはいけない、それらは最もクリーンな、 "最もMVC"のソリューションです。それらを適用することで、作業しているフレームワークについてもう少し学ぶことができます。 – m0sa

+0

はい、わかっています。私はそれを簡単に保つためにホッピングしていました。カスタムモデルのバインダーを実装しました。その方法で検証を続けました。私を正しい方向に向けてくれてありがとう。 – frennky

3

TryUpdateModelメソッドを呼び出すと、値を確認できるようにブール値を返すことができます。

更新:例外を指定してTryUpdateModelを試してみてください。アクションへのコメントの代わりにformcollectionを使用します。

[HttpPost] 
    public ActionResult Add(FormCollection collection) 
    { 

     string[] excludedProperties = new string[] { "Username". "Email" }; 
     var comment = new Comment(); 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider()); 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 
+0

いいえ、それは私が試みた最初のことであり、コントローラ内の他のすべてのメソッド:UpdateModel、ValidateModel、TryValidateです。それはどれも動作しませんが、私は例外があります:モデルを更新/検証することはできません。 – frennky

+0

その場合、なぜViewModelを使用しないのですか?これはあなたがアクションに渡すすべてのプロパティを含み、欠落しているものについて心配する必要はありません。 – Jon

+0

viewmodelを試してみるか、私の回答で更新された提案を試してください – Jon

関連する問題