0

我正在使用 C# 和 SQL Server 2005 开发一个 ASP .Net MVC 3 应用程序。

我也在使用实体框架和代码优先方法。

我有一个包含 DropDownList 的视图“应用程序”。

DropDownList 从基础中的表 Genre 加载其项目。

我想显示一个值表,并使用模型中已经定义的列表。

table 的值取决于 DropDownList 的值。我总是这个错误:

你调用的对象是空的。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

这是我的观点的代码:

<%@ 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; } 
}

堆栈跟踪 :

在此处输入图像描述

4

2 回答 2

3

如果此条件为假:

vv.SelectedGenre == "Famille"

vv.FaItems只要vv.SelectedGenre != "Famille", thenvv.FaItems为 null 并且NullReferenceException尝试在其上使用 foreach 时将抛出 a ,您就不会为此设置值。

您可以添加一个 else 并放置一个新的空列表,或者用 an 包装 foreachif (vv.FaItems != null)以避免异常。

于 2013-05-23T23:16:19.030 回答
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>();
    }
}
于 2013-05-23T23:37:18.817 回答