【问题标题】:Display SQL Server data in a view [duplicate]在视图中显示 SQL Server 数据 [重复]
【发布时间】:2016-01-08 15:01:47
【问题描述】:

好的,我看到了一些与此相关的类似问题。但我无法拼凑出一个答案来解决我的特定问题。

基本上,我正在尝试从 SQL Server 获取数据以将其打印到视图上(很简单,对吗?)。问题是:我在视图上发生了许多其他事情。所以,我必须使用一个模型(我认为)。

这是我所拥有的(我对 ASP.NET MVC 非常(非常非常非常)新):

型号

这是我尝试写入的首选项(模型/类是 Registrar)

//display props
public string QUID_Disp { get; set; }
public string QU_User_Disp { get; set; }
public string Admin_User_Disp { get; set; }
public string Reg_User_Disp { get; set; }

public List<Registrar> Events { get; set; }

这是我在控制器中的 SQL 调用

if (sqlStuff.Admin == "Yes")
{
    Registrar users = new Registrar();

    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["internet"].ConnectionString))
    {
        con.Open();

        using (SqlCommand da = new SqlCommand("select * from Registrar_Tool_Users", con))
        using (SqlDataReader reader = da.ExecuteReader())
        {
            while (reader.Read())
            {
                users.Events.Add (new Registrar { QU_User_Disp = reader["QU_User"].ToString(), QUID_Disp = reader["QUID"].ToString(), Admin_User_Disp = reader["Reg_Admin"].ToString() });
            }

            return View(users.Events);
        }
    }

并查看:

@model QUTools.Models.Registrar
//Things that are working here......
@{

    foreach (var item in Model.Events)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.QU_User_Disp)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.QUID_Disp)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Admin_User_Disp)
            </td>
        </tr>
    }
}

错误发生就行了

users.Events.Add (new Registrar...

然后说:

QUT.dll 中出现“System.NullReferenceException”类型的异常,但未在用户代码中处理

【问题讨论】:

  • 如果这就是错误所在,那么它与 MVC 无关。在此之后您将收到一个错误,因为传递给视图(事件列表)的数据与视图模型(注册器)不匹配。对于您的 SQL 错误,请查看以下内容:stackoverflow.com/help/mcve 特别是最小部分(例如,视图代码与此错误无关)-尝试将数据加载移动到其自己的方法(甚至是类/数据层)中以分离从数据查看中加载数据,以便您可以看到错误发生的位置(在数据加载中)
  • 我有个想法:学习如何调试你的代码。
  • 嘿,Ramiamilu——啊似乎没有通过。仍然得到空值。我运行了 sql cmd,它提取了一些 val,没有一个是 null。
  • 嘿,冰冻的,真的很好......
  • 初始化 - users.Events = new List&lt;Registrar&gt;();

标签: c# sql-server asp.net-mvc


【解决方案1】:

您正在对 NULL 的属性调用 Add() 方法。 Add() 方法适用于非空集合。因此您需要在调用Add() 方法之前将Events 集合初始化为空集合。

您可以在视图模型类的构造函数中执行此操作。

public class Registrar
{
   public string QUID_Disp { get; set; }
   public string QU_User_Disp { get; set; }
   public string Admin_User_Disp { get; set; }
   public string Reg_User_Disp { get; set; }
   public List<Registrar> Events { get; set; }

   public YourViewModel()
   {
     Events = new List<Registrar>();
   }
}

或者每当您创建 Registrar 的对象时。

Registrar users = new Registrar();
users.Events=new List<Registrar>();

或者

Registrar users = new Registrar { Events=new List<Registrar>() };

我还建议将您的属性/类名称重命名为更易读的名称。看起来你有一个 Registrar 类,它有一个名为Events 的属性,但它又是一个Registrar 的列表。以这样的方式命名您的视图模型是一个好主意,它可以解释此视图模型/它的属性的用途。例如

public class UserWithEventsVm
{
  public string DisplayName {set;get;}
  public List<EventVm> Events {set;get;}
  //Add other properties as needed by the view

  public UserWithEventsVm()
  {
    Events=new List<EventVm>();
  }
}
public class EventVm
{
  public int Id {set;get;}
  public string EventTitle {set;get;} 
}

【讨论】:

  • 对不起,Shyju。我以前没有使用过列表(这是我第一次尝试 MVC 项目)。您的代码帮助我解决了 Null 错误。但现在我不断收到错误传递到字典的模型项的类型为“System.Collections.Generic.List`1[QUTools.Models.Registrar]”,但该字典需要一个“QUTools”类型的模型项.Models.Registrar'。 -- 我不太明白这个错误,因为我传递到列表中的项目不是 qutools.models.registrar 类型吗?它似乎正在视图中发生。
  • 您的 GET 操作看起来如何?您应该传递 Registrar 的单个对象
  • 我不确定你的意思。但是,我正在传递对象 users.Events 并在视图中使用 foreach (var item in Model.Events) 然后尝试像这样显示数据:@Html.DisplayFor(m =&gt; item.QU_User_Disp)
  • 如果你将users.Events从你的action方法传递给你的View,你的view应该被强类型化到List并且你应该使用foreach(var item in Model)来循环它。
  • 是的——工作完美。再次感谢,Shyju!
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多