【问题标题】:ASP.NET MVC C#: Object reference errors when going to view record detailsASP.NET MVC C#:查看记录详细信息时出现对象引用错误
【发布时间】:2009-07-31 11:31:58
【问题描述】:

我是 .NET 和 MVC 新手,在 ASP 受苦太久后第一次学习它,现在是时候转换成更轻松地构建 Web 应用程序的工作了。

我一直在阅读 Stephen Walther 的有用视频教程,以了解大多数事情,并且到目前为止我取得了不错的进展。我遇到困难的地方是为我的应用程序 ConversationApp 中的记录创建详细信息页面。列出数据和插入新数据工作正常,但每次我查看任何特定记录的详细信息页面时,我都会收到错误消息“对象引用未设置为对象的实例”。

传递给控制器​​的 URL 是: /Home/Details/X(其中 X 是记录的唯一 ID)

如果能帮助我克服可能是我的一个非常愚蠢的错误或疏忽,我将不胜感激。

这是我目前的情况,代码方面:

HomeController.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using ConversationApp.Models;

namespace ConversationApp.Controllers
{
public class HomeController : Controller
{

    private conversationDBEntities _entities = new conversationDBEntities();

    //
    // GET: /Home/

    public ActionResult Index()
    {
        return View(_entities.conversation.ToList());
    }

    //
    // GET: /Home/Details/5

    public ActionResult Details(int id)
    {

        return View();
    }

    //
    // GET: /Home/Create

    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Home/Create

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([Bind(Exclude="conversation_id")]conversation conversationToCreate)
    {
        try
        {
            // TODO: Add insert logic here
            _entities.AddToconversation(conversationToCreate);
            _entities.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

    //
    // GET: /Home/Edit/5

    public ActionResult Edit(int id)
    {
        return View();
    }

    //
    // POST: /Home/Edit/5

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection collection)
    {
        try
        {
            // TODO: Add update logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
}
}

Details.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ConversationApp.Models.conversation>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Details
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Details</h2>

<fieldset>
    <legend>Fields</legend>
    <p>
        conversation_name:
        <%= Html.Encode(Model.conversation_name) %>
    </p>
    <p>
        conversation_owner:
        <%= Html.Encode(Model.conversation_owner) %>  
    </p>
    <p>
        conversation_description:
        <%= Html.Encode(Model.conversation_description) %>
    </p>
    <p>
        conversation_homeurl:
        <%= Html.Encode(Model.conversation_homeurl) %>
    </p>
</fieldset>
<p>

    <%=Html.ActionLink("Edit", "Edit", new { id=Model.conversation_id }) %> |
    <%=Html.ActionLink("Back to List", "Index") %>
</p>

/Home/Details/X 的错误消息(其中 X 是记录的唯一 ID)

Server Error in '/' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 13:         <p>
Line 14:             conversation_name:
Line 15:             <%= Html.Encode(Model.conversation_name) %>
Line 16:         </p>
Line 17:         <p> 

Source File: c:\Users\Michael Harris\Documents\Visual Studio 2008\Projects\ConversationApp\ConversationApp\Views\Home\Details.aspx    Line: 15 

Stack Trace: 

[NullReferenceException: Object reference not set to an instance of an object.]
ASP.views_home_details_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in c:\Users\Michael Harris\Documents\Visual Studio 2008\Projects\ConversationApp\ConversationApp\Views\Home\Details.aspx:15
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +256
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
System.Web.UI.Control.Render(HtmlTextWriter writer) +10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\Michael Harris\Documents\Visual Studio 2008\Projects\ConversationApp\ConversationApp\Views\Shared\Site.Master:26
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +256
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
System.Web.UI.Control.Render(HtmlTextWriter writer) +10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
System.Web.UI.Page.Render(HtmlTextWriter writer) +29
System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +59
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1266

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.4918; ASP.NET  
Version:2.0.50727.4918

【问题讨论】:

  • 顺便说一句,这是一个结构很好的问题。干得好。

标签: c# asp.net-mvc


【解决方案1】:

在控制器上的 Details 操作方法中,您不会将模型传递回视图。

public ActionResult Details(int id)
{
    // get model object

    return View(//pass model object to view here);
}

【讨论】:

    【解决方案2】:

    您似乎没有将任何数据传递给 Details 视图:

    public ActionResult Details(int id)
    {
       return View();
    }
    

    从存储库中检索模型类并将其传递给视图:

    return View(conversation);
    

    【讨论】:

      【解决方案3】:

      你的问题出在

      
      return View(_entities.conversation.ToList());
      

      您的视图就是您的页面。 View() 通常是您要显示的页面的路径。如果你不带参数传递它,ASP 将根据你的控制器获取默认路由,在这种情况下,它将根据你的路由选项重定向到 Home/Index.aspx 或 Default.aspx。

      如果你想将数据传递给你的视图,你应该使用 ViewData 哈希。该哈希在控制器和页面端可用。

      例如:

      
      
      Controller Code:
      
      public ActionResult Index()
          {
              List<string> li = new List<string>();
              li.Add("test");
              ViewData["myList"] = li;
              return View();
          }
      
      Page Code:
      
      <div>
      <%
         List<string> li = (List<string>)ViewData["myList"];
         foreach(string str in li)
         {
      %>
          <p><%= str %></p>
      <%
      }
      %>
      </div>
      

      【讨论】:

        【解决方案4】:

        感谢大家的快速帮助,这些提示为我指明了正确的方向。我错误地认为 HomeController 足够聪明,可以在创建视图后准确确定我希望它显示的内容。

        这些线索引导我: http://www.asp.net/learn/MVC/tutorial-26-cs.aspx

        经过一番阅读,我得到了我所寻求的答案。

        这是 HomeController.CS 的特定部分,它显示了我是如何工作的:

         // GET: /Home/Details/5
        
            public ActionResult Details(int id)
            {
                var conversationToView = (from c in _entities.conversation
                                          where c.conversation_id == id
                                          select c).FirstOrDefault();
                return View(conversationToView);
            }
        

        正如 aherrick 所说,我没有将模型传回去。 conversationToView 获取您希望查看的详细信息的记录的 ID,并将该信息传递给返回视图操作以检索所需的结果。

        同时,由于上述反馈,我也能够从我找到的教程中获得有关如何正确执行编辑的答案。它仍然没有提交已编辑的信息,而是一步一步提交。

        再次感谢所有对此做出如此迅速回应的人。这几天一直在绞尽脑汁。

        【讨论】:

          猜你喜欢
          • 2014-05-25
          • 1970-01-01
          • 2011-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多