2011-11-05 73 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> 
相關問題