将字符串值插入viewmodel列表

时间:2017-08-23 16:18:02

标签: c# asp.net-mvc

我在两周前发布了一个类似的问题,但是在成功调试时遇到了问题。感谢@Stephen Muecke帮助我排除故障。我正在重新发布,因为我对问题的后半部分没有任何牵引力,如下所述。

使用基于membertype的显示公司列表的站点功能,但我遇到了如何使用C#构建列表的问题。当我测试代码时,我得到一个未处理的异常错误,并且调试表明该列表为空。

这是viewmodel:

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行,带有公司名称。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

或使用对象初始化程序语法

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

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

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

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