Недопустимое состояние модели - PullRequest
11 голосов
/ 08 марта 2012

Итак, у меня есть представление с именем 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; }
}

Ответы [ 2 ]

34 голосов
/ 08 марта 2012

Используйте приведенный ниже код для повторения ошибок.Затем вы можете увидеть, какое поле и какой объект не проходит проверку.И тогда вы можете пойти оттуда.Просто просмотр свойства IsValid не даст достаточно информации.

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

А затем выполните цикл ошибок.

1 голос
/ 08 марта 2012

Прежде чем проверять свою ошибку, вам необходимо знать, почему состояние модели недействительно.Это можно легко сделать, отладив и просмотрев список ошибок.

Вторая ошибка должна быть отдельным вопросом, как я полагаю, написанным в руководящих принципах stackoverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...