【问题标题】:How to show a table basing on the value of DropDownList in ASP MVC and Entity Framework如何在 ASP MVC 和实体框架中根据 DropDownList 的值显示表格
【发布时间】:2013-05-23 22:59:44
【问题描述】:

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

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

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

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

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

table 的值取决于 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; } 
}

堆栈跟踪:

【问题讨论】:

  • 你能给我们这个异常的堆栈跟踪吗?
  • 确定!请检查我的编辑
  • 这没有多大帮助,我想知道引发异常的确切行,即使堆栈跟踪图片包含它我仍然不知道在你粘贴的地方放置它代码。
  • 啊,好吧,例外是在这一行:

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


【解决方案1】:

如果这个条件为假:

vv.SelectedGenre == "Famille"

您没有将值设置为vv.FaItems,因此只要vv.SelectedGenre != "Famille",然后vv.FaItems 为空,并且在尝试对其使用foreach 时将抛出NullReferenceException

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

【讨论】:

  • thx 但我认为它与该测试无关,因为当我删除它时,异常仍然存在
  • 什么时候删除?前锋? vv.SFItems 有同样的问题,但你不使用它。如果你的 foreach 用我建议的 if (vv.FaItems != null) 包装,会引发什么异常?
  • 我的意思是我删除了所有这部分代码: if (vv.SelectedGenre == "Famille") { vv.FaItems = db.Familles.ToList(); } else if (vv.SelectedGenre == "Sous Famille") { vv.SFItems = db.Sous_Familles.ToList(); }
  • 那么您已经消除了没有获得此异常的唯一可能性。你从来没有在 vv.FaItems 中输入一个值,那么它现在总是 null。用 if (vv.FaItems != null) 包裹你的 foreach
【解决方案2】:

这是一个替代方案,可以消除对鸭子类型检查的需要。

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

【讨论】:

  • thx joe ,,,您的解决方案也有效,,,抱歉无法设置 2 个答案,因为 Adam 是第一个回答的人 ,,,但您的解决方案也有效。但是,这仍然是一个问题:表格中没有显示任何项目!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多