如何根据ASP MVC和Entity Framework中DropDownList的值显示一个表

时间:2013-05-23 22:59:45

标签: c# sql-server visual-studio-2010 asp.net-mvc-3 entity-framework

我正在使用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; } 
}

堆栈追踪:

enter image description here

2 个答案:

答案 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>();
    }
}