今天我已经接近放弃了这个mvc应用!
我正在关注Mvc音乐商店教程,我被困在第54页.
这是我得到的错误:
System.NullReferenceException:未将对象引用设置为对象的实例.
错误发生在以下代码中的第三个段落(下拉列表)中:
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
此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>
Run Code Online (Sandbox Code Playgroud)
我意识到那里有很多代码,但是如果有人能看到一些明显我做错的事情,我会非常感激.
编辑
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);
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
我再次意识到我称之为MvcMovies1,这是一个错字,但所有内容都相应标记.
在那行中你是否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);
}
Run Code Online (Sandbox Code Playgroud)
首先,您需要在视图模型中添加属性以保留选定的艺术家和所选类型:
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; }
}
Run Code Online (Sandbox Code Playgroud)
然后在您的Edit.aspx视图中而不是:
<%: Html.EditorFor(model => model.Album,
new { Artists = Model.Artists, Genres = Model.Genres }) %>
Run Code Online (Sandbox Code Playgroud)
你可以简单地说:
<%: Html.EditorForModel() %>
Run Code Online (Sandbox Code Playgroud)
并在您的编辑器模板中~/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>
Run Code Online (Sandbox Code Playgroud)
并在您的编辑器模板中~/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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76306 次 |
| 最近记录: |