2012-03-08 19 views
9

私は私のデータベースのすべてのスレッドをレイアウトするインデックスと呼ばれるビューがあります。そのビューの中でスレッドのすべてのコメントを読み込んでいます。新しいコメントを作成するはずのフォームを呼び出すと、モデルの状態が無効であることがわかります。それはタイプ文字列からタイプのプロフィール、コメント、またはタグに変換できないことを私に伝えます。もともと私は私のコードとしてこれを持っていた:モデルの状態が無効

public ActionResult AddComment(Thread thread, string commentBody) 
    { 
     if (ModelState.IsValid) 
     { 
      _repository.AddComment(thread, comment); 
      TempData["Message"] = "Your comment was added."; 
      return RedirectToAction("Index"); 
     } 

その後、私はこれにそれを変更:

public ActionResult AddComment(Thread thread, string commentBody) 
    { 
     Profile profile = _profileRepository.Profiles.FirstOrDefault(x => x.Id ==  thread.ProfileId); 
     Tag tag = _tagRepository.Tags.FirstOrDefault(t => t.Id == thread.TagId); 
     thread.ThreadTag = tag; 
     thread.Profile = profile; 
     Comment comment = new Comment() 
           { 
            CommentBody = commentBody, 
            ParentThread = thread 
           }; 
     if (ModelState.IsValid) 
     { 
      _repository.AddComment(thread, comment); 
      TempData["Message"] = "Your comment was added."; 
      return RedirectToAction("Index"); 
     } 

をこれはまだ私のモデル状態が無効であることを私に伝えます。どのようにして状態を変えようとしないのですか?

もここでこのアクションを呼び出すために使用されている形態である。MOD上記のコードの例で

@using(Html.BeginForm("AddComment", "Thread", mod)) 
      { 
       <input type="text" name="AddComment" id="text" /> 
       <input type="submit" value="Save"/> 
      } 

スレッドであるモデルです。ここで要求された としては、糸の内側にすべてです:

public Thread() 
    { 
     this.ChildComments = new HashSet<Comment>(); 
    } 

    public int Id { get; set; } 
    public string TopicHeader { get; set; } 
    public string TopicBody { get; set; } 
    public Nullable<int> UpVotes { get; set; } 
    public Nullable<int> DownVotes { get; set; } 
    public int ProfileId { get; set; } 
    public int TagId { get; set; } 

    public virtual Profile Profile { get; set; } 
    public virtual ICollection<Comment> ChildComments { get; set; } 
    public virtual Tag ThreadTag { get; set; } 

そして最後にコメントクラス:

public partial class Comment 
{ 
    public int Id { get; set; } 
    public string CommentBody { get; set; } 
    public int UpVotes { get; set; } 
    public int DownVotes { get; set; } 

    public virtual Thread ParentThread { get; set; } 
} 
+0

あなたは 'Thread'オブジェクトの外観を表示する必要があります。 – RPM1984

+0

だからモデルステートチェックを外して、それが機能するかどうかを調べようとしました。今私はこのエラーが発生します: "エンティティオブジェクトは、IEntityChangeTrackerの複数のインスタンスによって参照することはできません。 –

+0

今、あなたはEntity Frameworkについて話しています。あなたはより多くの情報を提供する必要があります。 '_repository.AddComment(スレッド、コメント)'とは何ですか?既存のスレッドをThreadIdでフェッチし、 'thread.Comments.Add(newComment);を実行してからスレッドを保存するだけです。それはそれであるはずです。 – RPM1984

答えて

23

はエラーを繰り返し処理するために、次のコードを使用してください。次に、検証で失敗したフィールドとオブジェクトを確認できます。そしてそこから行くことができます。 IsValidプロパティを調べるだけでは十分な情報が得られません。

エラーをループします。

0

エラーを確認する前に、モデル状態が無効である理由を知る必要があります。デバッグしてエラーのリストを見ることで、簡単に実行できます。

私はstackoverflowのガイドラインで書かれていると思うので、2番目のエラーは別の質問になるはずです。

関連する問題