2012-12-18 105 views
2

我似乎無法理解ASP.MVC 4和Code First綁定中的子集合。對於子集合,我總是會得到一個模型對象爲null的錯誤。我甚至無法添加檢查,如果子集合爲空,因爲模型爲空。模型的子集合總是空的

我已經驗證,在控制器中,如果我創建一個批對象並向它添加步驟,那麼它將工作。

我敢肯定這是簡單的,但我無法弄清楚。

這裏是我的對象:

public class Batch 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Details { get; set; } 
    public virtual ICollection<Step> Steps { get; set; } 
} 
public class Step 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual int Days { get; set; } 
    public virtual Batch Batch { get; set; } 
} 

這裏是我的控制器操作:

[Authorize] 
    public ActionResult Create() 
    { 
     return View(); 
    } 

這是我的觀點:

@model BC.Models.Batch 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Batch</legend> 

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

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Details) 
     </div> 
     <div class="editor-field"> 
      @Html.TextAreaFor(model => model.Details) 
      @Html.ValidationMessageFor(model => model.Details) 
     </div> 

     <div> 
      <h3>Steps</h3> 
      // Here is where I get a error that model is null 
      @if(model.Steps != null) 
      { 
       foreach(var item in model.Steps) 
       { 
        @Html.EditorFor(model => item) 
       } 
      } 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

回答

2

實例化你的模型,並將其傳遞給視圖。

public ActionResult Create() 
     { 
      var model = new Batch(); 
      return View(model); 
     } 

這將解決視圖中空模型的NullReference異常。

但是,當您到達Psot操作時,Steps(批處理內的集合)可能爲空。爲了解決這個問題,請在構造函數中新建一個集合,如下所示:

public class Batch 
    { 
     public Batch() 
     { 
      Steps = new Collection<Step>(); 
     } 
     public virtual int Id { get; set; } 
     public virtual string Title { get; set; } 
     public virtual string Details { get; set; } 
     public virtual ICollection<Step> Steps { get; set; } 
    } 
+0

我完成了您在Create操作中編寫的內容,並且它引發了相同的編譯器錯誤。編譯器錯誤消息:CS0103:當前上下文中不存在名稱'model' –

+0

好吧,在我看來,我將小寫模型更改爲大寫模型,並且它與控制器操作中更改傳遞新批次。響應的第二部分,構造函數中集合的設置不起作用。出現以下錯誤:無法設置'Batch_E85AD838AF575CFACF76B82A41844C5D89E88CB62530C4C26D5F390441401D29'類型的屬性'Steps',因爲該集合已被設置爲EntityCollection。 –

+0

@Brian這是一個實體框架錯誤,可能發生在您的存儲庫/上下文中,不是嗎?它暗示了在屬性上使用「虛擬」關鍵字時創建的更改跟蹤代理的問題。另一個問題完全。 –