2017-08-23 40 views
0

两个星期前我发布了一个类似的问题,但有问题让它调试成功。感谢@Stephen Muecke帮助我排除故障。我正在重新发布,因为我没有对下面概述的问题的后半部分产生任何影响。插入一个字符串值到视图模型列表

基于membertype处理显示公司列表的网站功能,但我遇到了如何在C#中构建列表的问题。当我测试代码时,出现未处理的异常错误,调试表明列表为空。

这里是视图模型:

public class MemberListViewModel 
{ 
    public List<string> MemberList { get; set; } 
    public string MemberType { get; set; } 
} 

这里是控制器代码:

public class MemberListController : Controller 
{ 
public ActionResult MemberList() 
{ 
    return PartialView(PrepareMemberListViewModel()); 
} 

private MemberListViewModel PrepareMemberListViewModel() 
{ 
    MemberListViewModel viewModel = new MemberListViewModel(); 

    string orgType = "Distributor"; //TODO: hardcoded for dev 

    DataTable table = new DataTable(); 

    using (var connection = new SqlConnection("Provider=SQLOLEDB;Data Source=db.site.net;Persist Security Info=True;Initial Catalog=DB;User ID=SA;Password=PW")) 
    { 
     connection.Open(); 
if (orgType == "Manufacturer") 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = 'Manufacturer' and [Member Code] <> 'Associate - HBW'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
     else if (orgType == "HBW") 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = 'Manufacturer' and [Member Code] = 'Associate - HBW'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
     else 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = '" + orgType + "'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
connection.Close(); 
    } 

    for (int i = 0; i < table.Rows.Count; i++) 
     { 
      string memberName = table.Rows[i]["Member"].ToString(); 
      viewModel.MemberList.Add(memberName); 
     } 

    return viewModel; 
} 
} 

当我调试,一切运行顺利,直到我们到达

viewModel.MemberList.Add(memberName); 

在该行,viewModel.Memberlist的本地值固执地保持为null。我已经确认该表具有值 - 在本例中为35行,并带有公司名称。

我知道我错过了一些简单的东西,但是我是一个noob,所以不知道它是什么。提前致谢!

+1

您从未实例化过您的列表。 – Fran

+0

实例化您的MemberList – Atul

+0

在类的构造函数中实例化列表属性是一种很好的做法,因此您永远不会访问空列表。 – Fran

回答

2

您在NULL上致电Add方法,因此获得典型的空引用异常。

请确保您在调用任何方法/访问它之前将其初始化为空集合。

var viewModel = new MemberListViewModel(); 
viewModel.MemberList= new List<string>(); 

或使用对象初始化语法

var viewModel = new MemberListViewModel 
        { 
         MemberList= new List<string>() 
        }; 

恕我直言,收集类型属性不应该是零,如果没有数据,它应该是一个空列表。所以解决你的问题的另一种方法是更新你的类定义,使其具有一个将此属性初始化为空列表的构造函数。

public class MemberListViewModel 
{ 
    public List<string> MemberList { get; set; } 
    public string MemberType { get; set; } 

    public MemberListViewModel() 
    { 
     this.MemberList = new List<string>(); 
    } 
} 
+0

我知道这会变得简单......谢谢你,@Shyju,谢谢你的解释。我同意你对你的第三条建议的推理,所以就跟着那个前传的作品。再次感谢! – chipsterva69

相关问题