2009-12-10 65 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

相关问题