模型状态无效

问题描述:

所以我有一个叫index的视图,它列出了我数据库中的所有线程。然后在该视图中加载所有关于线程的评论。当我打电话给我的表单时,应该会创建一个新的评论,它会一直告诉我,我的模型状态是无效的。它告诉我,它不能从类型字符串转换为类型配置文件或注释或标签。我本来这是我的代码:模型状态无效

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"); 
     } 

这仍然告诉我,我的模型状态无效。我如何得到它,以便它不会尝试改变状态?

而且,这里是正在用于调用该操作形式:

@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 2012-03-08 03:34:39

+0

所以我试图删除modelstate检查,看看是否工作。现在我得到这个错误:“一个实体对象不能被多个IEntityChangeTracker实例引用。” – 2012-03-08 04:11:27

+0

现在你在谈论实体框架。您需要提供更多信息。 '_repository.AddComment(thread,comment)'做了什么?好像你需要做的就是通过它的ThreadId获取现有线程,然后执行'thread.Comments.Add(newComment);'然后保存线程。应该是这样。 – RPM1984 2012-03-08 04:28:26

使用下面的代码在错误进行迭代。然后你可以看到哪些字段和哪个对象在验证上失败。然后你可以从那里去。只要查看IsValid属性就不会提供足够的信息。

var errors = ModelState.Values.SelectMany(v => v.Errors); 

然后遍历错误。

在检查错误之前,您需要知道为什么模型状态无效。您可以通过调试和查看错误列表来轻松完成此操作。

第二个错误应该是一个单独的问题,因为我相信这是写在*指南。