在视图中显示SQL Server数据

时间:2016-01-08 15:01:48

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

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

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

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

模型

以下是我试图写入的首选项(模型/类是注册商)

//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'类型的异常,但未在用户代码中处理

1 个答案:

答案 0 :(得分:1)

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

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

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