2012-03-08 22 views
9

Así que tengo una vista llamada índice que establece todos los hilos en mi base de datos. Luego, dentro de esa vista, estoy cargando todos los comentarios en los hilos. Cuando llamo a mi formulario que se supone que crea un nuevo comentario, siempre me dice que el estado de mi modelo no es válido. Me dice que no puede convertir de tipo cadena a tipo perfil o comentario o etiqueta. Originalmente, tenía esto como mi código:Estado del modelo no válido

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

Entonces me cambiaron a esto:

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

Esto todavía me dice que mi modelo de estado no es válido. ¿Cómo lo obtengo para que no intente cambiar el estado?

También aquí es la forma que se utiliza para llamar a esta acción:

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

En el ejemplo de código anterior mod es el modelo que es un hilo. Y conforme a lo solicitado aquí es todo dentro de la rosca:

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

Y por último la clase comentario:

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

necesita mostrar el aspecto del objeto 'Thread'. – RPM1984

+0

Así que traté de eliminar la verificación de modelo de estado y ver si funcionó. Ahora recibo este error: "Un objeto de entidad no puede ser referenciado por varias instancias de IEntityChangeTracker". –

+0

bueno, ahora estás hablando de Entity Framework. Debes proporcionar más información. ¿Qué hace '_repository.AddComment (thread, comment)' hacer? Parece que todo lo que debe hacer es buscar el hilo existente por ThreadId, luego hacer 'thread.Comments.Add (newComment);' y luego guardar el hilo. eso debería ser. – RPM1984

Respuesta

23

usar el siguiente código de repetición de los errores. Luego puede ver qué campo y qué objeto está fallando en la validación. Y luego puedes ir desde allí. El solo hecho de mirar la propiedad IsValid no proporcionará suficiente información.

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

Y luego recorrer los errores.

0

Antes de verificar su error, debe saber por qué el estado del modelo no es válido. Puede hacerlo fácilmente depurando y viendo la lista de errores.

El segundo error debería ser una pregunta separada, ya que creo que está escrito en las pautas de stackoverflow.

Cuestiones relacionadas