Tengo dos modelos, que se ven a continuación, y estoy tratando de insertar uno de cada uno en la base de datos desde una vista. He creado un modelo de vista en un intento de hacer esto.MVC3 - Insertar usando ViewModel - Referencia de objeto no establecida en una instancia de un objeto
public class Blog
{
public int BlogID { get; set; }
public string Title { get; set; }
public DateTime CreatedOn { get; set; }
public virtual User User { get; set; }
public virtual ICollection<BlogPost> Posts { get; set; }
}
public class BlogPost
{
public int PostID { get; set; }
public string Body { get; set; }
public DateTime CreatedOn { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
}
public class BlogViewModel
{
public Blog Blog { get; set; }
public BlogPost BlogPost { get; set; }
}
Usando el modelo de vista i estoy publicando al controlador crear:
[HttpPost]
public ActionResult Create(BlogViewModel blog)
{
if (ModelState.IsValid)
{
User user = unit.UserRepository.GetUser();
blog.Blog.User = user;
blog.Blog.CreatedOn = DateTime.Now;
unit.BlogRepository.Insert(blog.Blog);
unit.BlogPostRepository.Insert(blog.BlogPost);
unit.Save();
return RedirectToAction("Index");
}
return View(blog);
}
Este seguir tirando el error
referencia a objeto no establecida como una instancia de un objeto.
en la línea blog.Blog.User = user
.
¿Alguna idea de lo que estoy haciendo mal?
EDITAR he comprobado los datos POST y era todo lo que hay y correcta pero estaba publicando todo como Blog.Title =
y BlogPost.Body =
por lo que el modelo de vista en el controlador no recibía nada. Si cambio la ActionResult controlador para:
public ActionResult Create(Blog blog, BlogPost post)
entonces todas las obras. Entonces, ¿por qué los datos no se envían en el formato viewmodel? Estoy usando la interacción basada en el modelo de vista explícita entre sus puntos de vista y el controlador
@model Test.Models.BlogViewModel
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Blog</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Blog.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Blog.Title)
@Html.ValidationMessageFor(model => model.Blog.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.BlogPost.Body)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BlogPost.Body)
@Html.ValidationMessageFor(model => model.BlogPost.Body)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Muéstranos el código de la vista – twoflower
Sí, sin ver cómo su vista está utilizando el modelo de vista, no podemos ayudarle. –
He agregado la vista. Muchas gracias. –