2012-06-27 24 views
2

我正在更新多個記錄,當我點擊提交按鈕後,我得到錯誤,這表明控制器收到NULL,並在第36行報告以下錯誤 下面是我的控制器,視圖和模型的代碼。集合被提交回控制器時獲取對象引用未設置爲對象的實例。錯誤

未將對象引用設置爲對象的實例。 描述:

執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤 以獲取有關該錯誤的更多信息以及源自 代碼的位置。 異常詳細信息:System.NullReferenceException:未將對象引用設置爲對象的實例。

Source Error: 

    Line 34:   public ActionResult UpdateAll(ICollection<Test0> test0s) 
    Line 35:   { 
    Line 36:    foreach (var tst in test0s) 
    Line 37:    { 
    Line 38:     if (ModelState.IsValid) 

    Source File: c:\users\rsc_vok\documents\visual studio 2010\Projects\MvcTest0\MvcTest0\Controllers\Test0Controller.cs Line: 36 

這裏是模型:

namespace MvcTest0.Models 
{ 
    public class Test0 
    { 
     public int id { get; set; } 
     public int SectnID { get; set; } 
     public string Section { get; set; } 
     public string Comment { get; set; } 
    } 

    public class Test0DBContext : DbContext 
    { 
     public DbSet<Test0> Test0s { get; set; } 
    } 
} 

這裏是我的控制器代碼:

public ActionResult UpdateAll(int id=0) 
    { 
     int sectnid = id; 
     List<Test0> records = db.Test0s.ToList(); 
     var Sectnrecord = from r in records 
         where r.SectnID == sectnid 
         select r; 

     return View(Sectnrecord.ToList()); 
    } 

    [HttpPost] 
    public ActionResult UpdateAll(ICollection<Test0> test0s) 
    { 
     foreach (var tst in test0s) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(tst).State = EntityState.Modified; 
      } 
     } 
     db.SaveChanges(); 

     return View(test0s); 
    } 

這裏是我的看法

 @model IEnumerable<MvcTest0.Models.Test0> 

     @{ 
     ViewBag.Title = "UpdateAll"; 
    } 

    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

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

     var sectnHeader = new String[10]; 
     sectnHeader[0] = "A. QUALITY"; 
     sectnHeader[1] = "B. VR REFERRAL"; 
     var items = Model.ToArray(); 
     var sections = 1; 
     for (var sectnLoop = 0; sectnLoop < sections; sectnLoop++) 
     { 
      <table> 
       <tr> 
        <td> 
         <b>@(sectnHeader[sectnLoop])</b> 
        </td> 
       </tr> 
      </table> 
      <table> 
       <tr> 
        <th>SectnID</th> 
        <th>Section</th> 
        <th>Comment</th> 
       </tr> 

      </table> 
      for (var i = sectnLoop * 2; i < sectnLoop * 2 + 2; i++) 
      { 
       var sctnid = "sectnname" + i; 
       @Html.HiddenFor(m => items[i].id) 
       @Html.HiddenFor(m => items[i].SectnID) 

       <table> 
        <tr> 
        <td> 
         @Html.DisplayFor(m => items[i].SectnID) 
        </td> 
        <td> 
         @Html.EditorFor(m => items[i].Section) 
         @Html.ValidationMessageFor(m => items[i].Section) 
        </td> 
        <td> 
         @Html.EditorFor(m => items[i].Comment) 
         @Html.ValidationMessageFor(m => items[i].Comment) 
        </td> 
       </tr> 
       </table> 
      } 
     } 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    } 
+0

視圖的代碼緊跟在上面的控制器的代碼之後,隨後是模型 - 抱歉,當我發佈問題時,我無法很好地將它們分開。 – user1456934

+0

您是否嘗試過'FormCollection coll'而不是您輸入的列表'ICollection test0s'?bcoz我懷疑它無法填充給定的模型。 –

回答

2

解決方案:

  1. 你必須改變視圖模型的集合類型支持.Add()方法:

    @model List<MvcTest0.Models.Test0>

  2. 改變所有的@Html.___For()助手,如:

    @Html.HiddenFor(m => m[i].id) 
    @Html.HiddenFor(m => m[i].SectnID) 
    @Html.DisplayFor(m => m[i].SectnID) 
    @Html.EditorFor(m => m[i].Section) 
    @Html.ValidationMessageFor(m => m[i].Section) 
    @Html.EditorFor(m => m[i].Comment) 
    @Html.ValidationMessageFor(m => m[i].Comment) 
    

注意模型必須重新創建回發和IEnumerable沒有方法添加項目本身,不像通用列表。

+1

什麼東西說。您不能將接口用於操作方法參數。將行爲方法參數視爲啞DTO,而不是具有行爲的域對象。 Ack! – Haacked

+0

Ack!例如,在'ICollection'的情況下,MVC會創建什麼?實現ICollection的可能類有無數個。 MVC需要一個具體的類作爲參數。 – Haacked

+0

謝謝 - 解決了問題 – user1456934

相關問題