ASP.NET MVC C #: ошибки ссылки на объект при просмотре сведений о записи - PullRequest
2 голосов
/ 31 июля 2009

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

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

URL, передаваемый в контроллер: / Home / Details / 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

Ответы [ 4 ]

1 голос
/ 31 июля 2009

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

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

Получите класс вашей модели из хранилища и передайте его в представление:

return View(conversation);
1 голос
/ 31 июля 2009

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

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

    return View(//pass model object to view here);
}
0 голосов
/ 31 июля 2009

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

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

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

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

0 голосов
/ 31 июля 2009

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


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

Ваш вид - это просто ваша страница. View () - это обычно путь к странице, которую вы хотите отобразить. Если вы передадите его без параметров, ASP получит маршрут по умолчанию на основе вашего контроллера. В этом случае он будет перенаправлен на Home / Index.aspx или Default.aspx в зависимости от ваших параметров маршрутизации.

Если вы хотите передать данные в ваше представление, вы должны использовать хеш ViewData. Этот хэш доступен на контроллере и на странице.

Ex:



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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...