MVC3 - Insertar usando ViewModel - Referencia de objeto no establecida en una instancia de un objeto
Tengo dos modelos, como se ve 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.
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; }
}
Utilizando el modelo de vista que estoy publicando en el controlador de creación:
[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);
}
Esto sigue arrojando el error
Referencia a objeto no establecida como instancia de un objeto
en la líneablog.Blog.User = user
.
Alguna idea de lo que estoy haciendo ma
EDITA Verifiqué los datos POST y estaba todo allí y correcto, pero estaba publicando todo comoBlog.Title =
yBlogPost.Body =
por lo que el modelo de vista en el controlador no estaba recibiendo nada. Si cambio la acción del controlador a:
public ActionResult Create(Blog blog, BlogPost post)
Entonces todo funciona. Entonces, ¿por qué los datos no se envían en el formato viewmodel? Estoy usando una interacción basada en el modelo de vista explícita entre sus vistas 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>