2009-12-10 66 views
0

當我調用我的控制器之一的編輯動作時出現此錯誤。Html.TextBox()拋出System.NullReferenceException

下面是編輯操作方法

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(cedetails detailToEdit) 
    { 
     validateDetail(detailToEdit); 
     if (!ModelState.IsValid) 
      return View(); 

     try 
     { 
      var originaldetail = (from d in entity1.cedetails 
            where d.detail_id == detailToEdit.detail_id 
            select d).FirstOrDefault(); 
      entity1.ApplyPropertyChanges(originaldetail.EntityKey.EntitySetName, detailToEdit); 
      entity1.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

的C#代碼這是validateDetail方法:

<%= Html.TextBox("c_name", Model.c_name) %> 

protected void validateDetail(cedetails detailToValidate) 
{ 

    if (detailToValidate.c_name.Trim().Length == 0) 
     ModelState.AddModelError("c_name", "C name is required."); 
     ModelState.SetModelValue("c_name", ValueProvider["c_name"]); 
    if (detailToValidate.a_server.Trim().Length == 0) 
     ModelState.AddModelError("a_server", "A server is required."); 
     ModelState.SetModelValue("a_server", ValueProvider["a_server"]); 
    if (detailToValidate.d_server.Trim().Length == 0) 
     ModelState.AddModelError("d_server", "D server is required."); 
     ModelState.SetModelValue("d_server", ValueProvider["d_server"]); 
    if (detailToValidate.l_server.Trim().Length == 0) 
     ModelState.AddModelError("l_server", "L server is required."); 
     ModelState.SetModelValue("l_server", ValueProvider["l_server"]); 
    if (detailToValidate.url.Trim().Length == 0) 
     ModelState.AddModelError("url", "URL is required."); 
     ModelState.SetModelValue("url", ValueProvider["url"]); 
    if (detailToValidate.s_id.Trim().Length == 0) 
     ModelState.AddModelError("s_id", "S ID is required."); 
     ModelState.SetModelValue("s_id", ValueProvider["s_id"]); 
} 

我在這行得到錯誤異常詳細信息: System.NullReferenceException:Object referen ce未設置爲對象的實例。

我已經搜索了這個錯誤,併發生在幾個解決方案,但沒有人爲我工作。請讓我知道這是否可以解決。我還會補充一點,我選擇隱藏視圖中的某些表列,包括detail_id,不僅僅是顯示它們。

+0

幾乎所有'NullReferenceException'的情況都是相同的。請參閱「[什麼是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)」的一些提示。 – 2014-05-15 19:23:55

回答

2

索引操作是否設置模型?編輯動作不在任何地方,所以如果未在Index動作中設置模型(ala返回View(cedetials)),那麼模型將爲空。

+0

是的模型是這樣設置在索引中的: return View(entity1.cedetails.ToList()); – Animesh 2009-12-10 22:31:06

0

我認爲blue_fenix在他的回答中有一個點。看來你不設置模型 這裏:

if (!ModelState.IsValid) 
      return View(); 

這裏:

catch 
     { 
      return View(); 
     } 

您需要返回的模式,因爲HTML文本框助手是出席觀看了一個模型,不容有空值。在每種情況下,請嘗試返回相同的綁定模型:

return View(detailToEdit); 
+0

嗨, 我現在明白blue_fenix的意思了。我已經改變了操作方法來返回每個返回語句中的模型,現在我沒有得到錯誤,但頁面發佈給自己而不是重定向到索引,並且更改沒有反映在數據庫中。當我調試編輯方法和'進入'我注意到 entity1.ApplyPropertyChanges(originaldetail.EntityKey.EntitySetName,detailToEdit); 這條語句沒有進入,它直接進入catch語句,它給出了相同的異常:對象引用未設置爲對象的實例 – Animesh 2009-12-11 14:03:23

+0

很難說出什麼問題,因爲我不知道什麼是錯誤的ApplyPropertyChanges正在這樣做,它看起來像這兩個參數是null(最有可能是originaldetail)。有一件事我不明白的是爲什麼你發送「originaldetail.EntityKey.EntitySetName」而不是「originaldetail」,它看起來與「detailToEdit」是一樣的。 – JOBG 2009-12-11 14:30:55

+0

ApplyPropertyChanges方法使用entitySetName,並將對象更改爲其參數。我已經像你說過的那樣試過了,但是這種方法沒有其他重載。我實際上是從網站中給出的ASP.NET MVC聯繫管理器示例中採用這種方式。 – Animesh 2009-12-11 15:07:41

相關問題