ASP.NET MVC C #: ошибки ссылки на объект при просмотре сведений о записи

2

Я новичок .NET и MVC и впервые узнал об этом, слишком долго страдая от ASP, и о времени, которое я переделал, чтобы упростить мою работу по созданию веб-приложений.

Я проходил через Стивен Уолтер полезные видеоуроки, чтобы освещать большинство вещей, и до сих пор я добился хорошего прогресса. Там, где я отвязался, создается страница сведений о записи в моем приложении ConversationApp. Листинг данных и вставка новых данных работают отлично, но каждый раз, когда я перехожу к просмотру страницы сведений для какой-либо конкретной записи, я получаю сообщение об ошибке "Ссылка на объект не установлена ​​в экземпляр объекта".

URL, передаваемый контроллеру: /Главная/Подробнее/X (где X - уникальный идентификатор для записи)

Я был бы признателен за любую помощь, чтобы заставить меня пройти мимо того, что, вероятно, является очень глупой ошибкой моей или надзором.

Здесь, где я до сих пор, код мудрый:

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 - уникальный идентификатор для записи)

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
  • 0
    Кстати, это очень хорошо продуманный вопрос. Отлично сработано.
  • 0
    Спасибо за комплимент.
Теги:
asp.net-mvc

4 ответа

1
Лучший ответ

В вашем методе действий "Сведения" на контроллере вы не передаете модель обратно в представление.

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

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

Не похоже, что вы передаете данные в представление Details:

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

Извлеките класс модели из своего репозитория и передайте его в представление:

return View(conversation);
0

Спасибо всем за эту помощь суперклина, и эти намеки указали мне в правильном направлении. Я ошибочно предположил, что 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);
    }

Как отметил аэррик, я не возвращал модель назад. talkToView захватывает идентификатор записи, сведения о которой вы хотите просмотреть, и передает эту информацию в действие вида возврата, чтобы получить желаемый результат.

В то же время я также смог получить ответ о том, как правильно отредактировать, а также из учебника, которое я нашел благодаря вышеупомянутой обратной связи. Он по-прежнему не отправляет отредактированную информацию, но один шаг за раз.

Еще раз, спасибо всем, кто так быстро отреагировал на это. Это терзало мои мозги в течение нескольких дней.

0

Ваша проблема в


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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню