我正在使用C#和SQL Server 2005开发ASP .Net MVC 3应用程序。
我也在使用Entity Framework和Code First Method。
我有一个包含DropDownList的视图'Application'。
DropDownList从基础中的表格Genre加载其项目。
我想显示一个值表,并使用已在模型中定义的列表。
表的值取决于DropDownList的值。 我总是有这个错误:
对象引用未设置为对象的实例。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
这是我的观点代码:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication2.Models.FlowViewModel>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Application
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Application</h2>
<form id="form1" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %> </h2>
<div>
<%:Html.Label("Type :")%><%: Html.DropDownListFor(model => model.SelectedGenre, Model.GenreItems)%>
</div>
<table border = "transparent">
<tr>
<th>
</th>
</tr>
<% foreach (var item in Model.FaItems) { %>
<tr>
<td>
<%: Html.DisplayFor(modelItem => item.Nom_Famille) %>
</td>
</tr>
<% } %>
</table>
</form>
</asp:Content>
这是控制器:
[HttpGet]
public ActionResult Application(Genre genre)
{
var vv = new FlowViewModel();
vv.GenreItems = new SelectList(db.Genres.ToList(), "ID_G", "ID_G");
if (vv.SelectedGenre == "Famille")
{
vv.FaItems = db.Familles.ToList();
}
else if (vv.SelectedGenre == "Sous Famille")
{
vv.SFItems = db.Sous_Familles.ToList();
}
return View(vv);
}
最后这是模型'FlowViewModel':
public class FlowViewModel
{
[Key]
public string IDv { get; set; }
public List<Famille> FaItems { get; set; }
public List<Sous_Famille> SFItems { get; set; }
[NotMapped]
public SelectList GenreItems { get; set; }
public string SelectedGenre { get; set; }
}
堆栈追踪:
答案 0 :(得分:3)
如果此条件为假:
vv.SelectedGenre == "Famille"
您没有将值设置为vv.FaItems
,因此只要vv.SelectedGenre != "Famille"
,vv.FaItems
为空,并在尝试使用foreach时抛出NullReferenceException
它
您可以添加其他内容并添加新的空列表,也可以使用if (vv.FaItems != null)
包装foreach以避免异常。
答案 1 :(得分:1)
这是一种替代方案,可以消除鸭型检查的需要。
public class FlowViewModel
{
[Key]
public string IDv { get; set; }
public List<Famille> FaItems { get; set; }
public List<Sous_Famille> SFItems { get; set; }
[NotMapped]
public SelectList GenreItems { get; set; }
public string SelectedGenre { get; set; }
public FlowViewModel()
{
FaItems = new List<Famille>();
SFItems = new List<Sous_Famille>();
}
}