2011-11-05 50 views
14

我有两个模型,见下,并试图从一个视图中插入其中每个模型到数据库。我已经创建了一个视图模型来尝试这样做。MVC3 - 使用ViewModel插入 - 未将对象引用设置为对象的实例

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

使用视图模型我张贴到创建控制器:

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

这保持引发错误

对象引用不设置到对象的实例。

就行blog.Blog.User = user

对我做错什么想法?

编辑 我查了POST数据,它是所有那里,正确的,但它被张贴一切,Blog.Title =BlogPost.Body =所以在控制器中的视图模型并没有收到任何东西。如果我改变控制器的ActionResult到:

public ActionResult Create(Blog blog, BlogPost post)

然后,它所有的作品。那么为什么不以视图模型格式发送数据呢?我正在使用显式视图模型基于您的视图和控制器之间的交互

@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> 
+0

我们展示视图代码 – twoflower

+0

是,没有看到你的观点是如何使用视图模型,我们不能帮你。 –

+0

我已添加视图。非常感谢。 –

回答

35

只需重命名你的行动的说法:

public ActionResult Create(BlogViewModel viewModel) 

有冲突,因为你的行动的说法被称为blog,但您的视图模型(BlogViewModel)有一个名为Blog属性。问题在于,默认模型联编程序不再知道在这种情况下该怎么做。

哦,如果你绝对需要你的动作参数叫做blog那么你也可以在你的视图模型上重命名Blog属性。

+0

非常感谢! –

+0

maaan!我有同样的问题!谢谢@Darin Dimitrov –

+0

哇,我不会自己想出来的,谢谢! – Psddp

4

我以前曾经遇到过这种情况。发生这种情况时,您从视图发送的数据不是格式,MVC默认模型绑定引擎可以理解或可以映射到您的视图模型对象。尝试使用“FireBug”并查看如何通过POST传递数据。然后看看,如果这些数据可以映射到你的视图模型的定义。

还有一件事,你使用jQuery来传递数据,或者你正在使用视图和控制器之间基于显式视图模型的交互?

+0

谢谢!我已经更新了这个问题来反映这个... –

0

@迈克尔。威尔莫特

虽然这个话题是6岁,但我发现它对于我最近处理了一个场景是有用的。

在我的MVC视图中,改为使用标识符的完整路径,我在Razor中使用内联捷径变量,并导致回发视图模型到服务器为null。这是因为“名”和“ID”属性的HTML元素没有被正确地渲染为MVC约束机制预计:

下列哪项是错误的声明:

@{ 
    var b = Model.Blog; // short cut caused problem of postback model binding 
} 

<div class="editor-field"> 
      @Html.EditorFor(model => b.Title) 
      @Html.ValidationMessageFor(model => b.Title) 
     </div> 

下面是正确的声明为全路径标识符需要:

<div class="editor-field"> 
      @Html.EditorFor(model => model.Blog.Title) 
      @Html.ValidationMessageFor(model => model.Blog.Title) 
     </div> 
相关问题