今天我已经接近放弃这个mvc应用了!!
我正在关注Mvc音乐商店教程,我被困在第54页。
这是我得到的错误:
System.NullReferenceException:Object 引用未设置为的实例 对象
错误发生在以下代码中的第三个段落(下拉列表)中:
<%@ 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>
此ascx文件包含在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>
我意识到那里有很多代码,但是如果有人能看到一些明显我做错的事情,我会非常感激。
修改
StoreManagerController.cs(编辑)
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; }
}
}
我再次意识到我称之为MvcMovies1,这是一个错字,但所有内容都相应标记。
答案 0 :(得分:7)
Album
是否有ArtistId
,因为在该行中您正在调用Model.ArtistId
,如果Album
上没有该属性,您将获得空引用异常。这是因为模型是对您的视图强类型的对象的简写,在您的情况下恰好是Album
。
您在上面的代码中没有设置ViewData [“Artists”]的位置。您是否在任何地方进行设置,因为这也可能是您的问题。
修改强>
在操作中设置ViewData,它应该可以工作:
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 :(得分:6)
首先,您需要在视图模型中添加属性以保留选定的艺术家和所选类型:
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; }
}
然后在Edit.aspx
视图中而不是:
<%: Html.EditorFor(model => model.Album,
new { Artists = Model.Artists, Genres = Model.Genres }) %>
你可以简单地说:
<%: Html.EditorForModel() %>
并在您的编辑器模板中~/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>
并在您的编辑器模板中~/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>
答案 2 :(得分:1)
您只是不能设置ViewData["Artists"]
和ViewData["genres"]
,因为我可以从您的操作方法中看到。
如果您想在视图中使用这些值,请确保在请求的生命周期内某处设置这些值。
答案 3 :(得分:1)
您是否尝试过转换为List和List而不是IEnumerable?
答案 4 :(得分:0)
问题:
对象引用未设置为对象的实例
解决方案:
pubblic ActionResult yourDetails()
{
List<YourEntityName> PropertyName= new List<YourEntityName>();
list = db.PropertyName.ToList();
return View(list);
}
YourEntityName
表示您的表名,即PassengerDetial
PropertyName
表示您的班级公共财产,即PassengerDetails
pubblic Class PassengerDetailContext : DbContext
{
pubblic DbSet<PassengerDetail> passegerDetails {get;set;}
}
List<PassengerDetail> passegerDetails = new List<PassengerDetail>();
list = db.passegerDetails.ToList();
return View(list);
答案 5 :(得分:0)
尝试运行迁移时遇到同样的错误(update-database)。 有2个项目,即ViewProject和DBcontextProject。
我的问题是我将ViewProject作为一个启动项目并在DBcontextProject上运行了迁移。
解决方案是使DBcontextProject成为一个启动项目并在DBcontextProject上运行迁移。