2010-10-20 73 views
6

Tôi sắp ngừng từ bỏ ứng dụng mvc này cho hôm nay !!Lỗi MVC: Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng

tôi sau MVC Music Store Hướng dẫn và tôi bị mắc kẹt trên trang 54.

đây là lỗi tôi nhận được:

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

Lỗi này xảy ra trong khối đoạn thứ ba (DropDownList) trong đoạn mã sau:

<%@ Import Namespace ="MvcMovies1" %> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMovies1.Models.Album>" %> 

<p> 
    <%: Html.LabelFor(model => model.Title) %> 
    <%: Html.TextAreaFor(model => model.Title) %> 
    <%: Html.ValidationMessageFor(model => model.Title) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.Price) %> 
    <%: Html.TextAreaFor(model => model.Price) %> 
    <%: Html.ValidationMessageFor(model => model.Price) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.AlbumArtUrl) %> 
    <%: Html.TextAreaFor(model => model.AlbumArtUrl) %> 
    <%: Html.ValidationMessageFor(model => model.AlbumArtUrl) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.Artist) %> 
    <%: Html.DropDownList("ArtistId", new SelectList(ViewData["Artists"] as IEnumerable, "ArtistId", "Name", Model.ArtistId)) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.Genre) %> 
    <%: Html.DropDownList("GenreId", new SelectList(ViewData["Genres"] as IEnumerable, "GenreId", "Name", Model.GenreId)) %> 
</p> 

    <div> 
     <%: Html.ActionLink("Back to List", "Index") %> 
    </div> 

file ascx này được chứa trong một tập tin Edit.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcMovies1.ViewModels.StoreManagerViewModel>" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Edit 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<form id="form1" runat="server"> 
    <h2>Edit</h2> 
    <% using (Html.BeginForm()) 
     { %> 
     <%: Html.ValidationSummary(true)%> 

    <fieldset> 
     <legend>Edit Album</legend> 
     <%: Html.EditorFor(model => model.Album, 
      new { Artists = Model.Artists, Genres = Model.Genres }) %> 

      <p><input type="submit" value="Save" /></p> 


    </fieldset> 

     <% } %> 
     </form> 
</asp:Content> 

Tôi nhận ra có rất nhiều mã ở đó nhưng nếu có ai có thể thấy điều gì đó hiển nhiên rằng tôi đang làm sai, tôi sẽ rất biết ơn.

EDIT

StoreManagerController.cs (Chỉnh sửa)

public ActionResult Edit(int id) 
    { 
     var viewModel = new StoreManagerViewModel 
     { 
      Album = storeDB.Albums.SingleOrDefault(a => a.AlbumId == id), 
      Genres = storeDB.Genres.ToList(), 
      Artists = storeDB.Artists.ToList() 
     }; 

     return View(viewModel); 
    } 

Andddd..StoreManagerViewModel.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using MvcMovies1.Models; 

namespace MvcMovies1.ViewModels 
{ 
    public class StoreManagerViewModel 
    { 
     public Album Album { get; set; } 
     public List<Artist> Artists { get; set; } 
     public List<Genre> Genres { get; set; } 
    } 
} 

Một lần nữa tôi nhận ra tôi gọi nó là MvcMovies1, đây là một lỗi đánh máy nhưng mọi thứ đều được đánh dấu tương ứng.

+4

Bạn cũng có thể đăng tác vụ trong bộ điều khiển của mình không. Bạn có thiết lập ViewData ["Artists"] trong bộ điều khiển không? – lancscoder

+0

Xin chào Simon G. Tôi đã đăng mã được yêu cầu. Cảm ơn vi đa trả lơi. – 109221793

+0

Bạn có thể đặt điểm ngắt trên dòng đó và kiểm tra tất cả các thuộc tính cho null không? – Rup

Trả lời

6

AlbumArtistId vì trong dòng đó bạn đang gọi Model.ArtistId và nếu Album không có thuộc tính đó, bạn sẽ nhận được ngoại lệ tham chiếu null. Đó là vì Mô hình là viết tắt của đối tượng được nhập mạnh vào chế độ xem của bạn, điều này xảy ra là Album trong trường hợp của bạn.

Không có nơi nào trong mã trên của bạn nơi bạn đang đặt Chế độ xem ["Nghệ sĩ"]. Bạn có đặt nó ở bất cứ nơi nào vì đó có thể là vấn đề của bạn không.

EDIT

Đặt ViewData trong hành động và nó sẽ làm việc:

public ActionResult Edit(int id) 
{ 
    var viewModel = new StoreManagerViewModel 
    { 
     Album = storeDB.Albums.SingleOrDefault(a => a.AlbumId == id), 
     Genres = storeDB.Genres.ToList(), 
     Artists = storeDB.Artists.ToList() 
    }; 

    ViewData["Artists"] = storeDB.Artists.ToList(); 
    ViewData["Genres"] = storeDB.Genres.ToList(); 

    return View(viewModel); 
} 
+1

Nhưng kể từ khi mô hình được đánh máy mạnh mẽ sẽ không trang không biên dịch nếu ArtistId bị thiếu hơn là ném một ngoại lệ tham chiếu null? – Rup

+0

Hi amurra ... Tôi nghĩ đó là ViewData ["Artists"] đây là vấn đề của tôi. Tôi chỉ học Mvc vì vậy tôi đã theo đúng nghĩa đen theo những gì đã có trong bài hướng dẫn nên tôi bị bối rối! – 109221793

+0

@Rup - Tôi tin rằng chỉ khi bạn đang biên dịch các chế độ xem thì nó sẽ hiển thị sau đó, nếu không nó sẽ được tìm thấy trong thời gian chạy – amurra

2

ur đơn giản là không thiết ViewData [ "Nghệ sĩ"] và ViewData [ "thể loại"] như tôi có thể c từ phương pháp hành động ur.đảm bảo ur thiết lập các giá trị đâu đó trong suốt cuộc đời của một yêu cầu nếu u muốn sử dụng chúng trong ur xem

+0

Không phải nó đã được hợp nhất vào ViewData bởi lệnh gọi 'EditorFor'? Cô ấy truyền nó trong tham số addViewData http://msdn.microsoft.com/en-us/library/ff406462.aspx – Rup

+7

hãy đánh vần 'bạn' thay vì 'u'. đây không phải là twitter. – automagic

+2

@james u đã nhận nó vì vậy điểm số –

6

Trước tiên, bạn cần phải thêm các thuộc tính trong mô hình quan điểm của bạn để giữ nghệ sĩ được lựa chọn và thể loại được lựa chọn:

public class StoreManagerViewModel 
{ 
    public Album Album { get; set; } 
    public int? SelectedArtistId { get; set; } 
    public List<Artist> Artists { get; set; } 
    public int? SelectedGenreId { get; set; } 
    public List<Genre> Genres { get; set; } 
} 

sau đó, trong Edit.aspx xem của bạn thay vì:

<%: Html.EditorFor(model => model.Album, 
    new { Artists = Model.Artists, Genres = Model.Genres }) %> 

bạn có thể chỉ đơn giản là:

<%: Html.EditorForModel() %> 

và trong trình soạn thảo của bạn mẫu ~/Views/Home/EditorTemplates/Album.ascx:

<%@ Import Namespace ="MvcMovies1" %> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMovies1.Models.Album>" %> 

<p> 
    <%: Html.LabelFor(model => model.Title) %> 
    <%: Html.TextAreaFor(model => model.Title) %> 
    <%: Html.ValidationMessageFor(model => model.Title) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.Price) %> 
    <%: Html.TextAreaFor(model => model.Price) %> 
    <%: Html.ValidationMessageFor(model => model.Price) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.AlbumArtUrl) %> 
    <%: Html.TextAreaFor(model => model.AlbumArtUrl) %> 
    <%: Html.ValidationMessageFor(model => model.AlbumArtUrl) %> 
</p> 

và trong trình soạn thảo của bạn mẫu ~/Views/Home/EditorTemplates/StoreManagerViewModel:

<%@ Import Namespace ="MvcMovies1" %> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMovies1.ViewModels.StoreManagerViewModel>" %> 

<%: Html.EditorFor(model => model.Album) %> 

<p> 
    <%: Html.LabelFor(model => model.SelectedArtistId) %> 
    <%: Html.DropDownListFor(model => model.SelectedArtistId, new SelectList(Model.Artists, "ArtistId", "Name")) %> 
</p> 

<p> 
    <%: Html.LabelFor(model => model.SelectedGenreId) %> 
    <%: Html.DropDownListFor(model => model.SelectedGenreId, new SelectList(Model.Genres, "GenreId", "Name")) %> 
</p> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 
+0

Xin chào Darin, bạn dường như biết công cụ của bạn là gì nhưng một điều tôi không hiểu là lý do tại sao các tập tin Album.ascx bây giờ được chia thành hai tập tin khác nhau? – 109221793

+1

Bởi vì để phân tách mối quan tâm tốt hơn, mẫu trình chỉnh sửa Album chỉ nên quan tâm đến các thuộc tính album chứ không phải các Thể loại và Nghệ sĩ được phân tách. Nó cũng giúp bạn làm việc với các chuỗi ViewState và ma thuật xấu xí và truyền tới IEnumerable, nó luôn thích hợp hơn khi làm việc với cách gõ mạnh. –

+0

Hmm, được rồi. Trong hướng dẫn, bạn sẽ thấy các hộp văn bản html, nhãn, danh sách thả xuống, vv là tất cả trong một tệp. Tôi muốn làm theo điều đó càng chặt chẽ càng tốt. Nếu tôi hợp nhất hai điều trên thành một, liệu có ổn không khi làm việc cùng? – 109221793

1

Các bạn đã thử đúc vào danh sách và Danh mục thay vì IEnumerable?

0

vấn đề: Đối tượng tham chiếu không được đặt để một thể hiện của một đối tượng Giải pháp:

 pubblic ActionResult yourDetails() 
{ 
    List<YourEntityName> PropertyName= new List<YourEntityName>(); 
       list= db.PropertyName.ToList(); 
       return View(list); 
} 

YourEntityName bình Bảng Tên của bạn tức là PassengerDetial PropertyName bình Class sở hữu pubblic tức PassengerDetails

pubblic Class PassengerDetailContext : DbContext 
{ 
    pubblic DbSet<PassengerDetail> passegerDetails {get;set;} 
} 



List<PassengerDetail> passegerDetails = new List<PassengerDetail>(); 
       list= db.passegerDetails .ToList(); 
       return View(list); 
0

Đã cùng một lỗi trong khi cố gắng chạy di chuyển (cập nhật cơ sở dữ liệu). có 2 dự án là ViewProject và DBcontextProject.

vấn đề của tôi là tôi đã tạo ViewProject một dự án khởi động và chạy di chuyển trên DBcontextProject.

Giải pháp là tạo DBcontextProject một dự án khởi động và chạy di chuyển trên DBcontextProject.

Các vấn đề liên quan