使用视图模型属性填充下拉列表

时间:2013-10-07 19:07:44

标签: .net asp.net-mvc asp.net-mvc-3 linq html.dropdownlistfor

我试图避免使用视图包来填充Html.DropDownListFor而没有最好的运气。

我想提取特定SQL表上使用的所有状态代码并选择不同的值。然后,我想使用这些结果填充视图上的下拉列表。

为了做到这一点,我创建了一个List<SelectListItem>作为我的视图模型的属性。在控制器中,我尝试使用Linq查询来加载List。如果我单步执行代码,这似乎工作正常(我可以看到查询后List中有50个条目),但是当页面加载时抛出NullReferenceException指向{ {1}}。

查看模型

DropDownListFor

控制器

public class ZipCodeIndex
{
    public List<ZipCodeTerritory> zipCodeTerritory { get; set; }
    [DisplayName("Zip Code")]
    public string searchZip { get; set; }
    public List<SelectListItem> StateCodes { get; set; }
    [DisplayName("Effective on this date")]
    public string searchDate { get; set; }
    [DisplayName("State")]
    public string searchState { get; set; }
    [DisplayName("New Territory")]
    public string newTerritory { get; set; }
    [DisplayName("New Description")]
    public string newDescription { get; set; }
    [DisplayName("New Effective Date")]
    public string newEffectiveDate { get; set; }

    public ZipCodeIndex() 
    {
        zipCodeTerritory = new List<ZipCodeTerritory>();
    }
}

查看

//Set state code drop down list
search.StateCodes = (from z in db.ZipCodeTerritory
                        select z.StateCode).Select(x => new SelectListItem
                        {
                            Text = x,
                            Value = x
                        }).Distinct().ToList();

1 个答案:

答案 0 :(得分:0)

这是因为我的控制器中的return语句而发生的。我设置了一个条件来确定这是否是初始页面加载,如果是这样,只需将用户发送回控制器。因此,return语句只是return View(),因此我没有向视图发回Model个对象。以下代码修复了该问题。 (search是我的视图模型的实例)

        //Proceed with search
        try
        {
            //Set state code drop down list
            search.StateCodes = (from z in db.ZipCodeTerritory
                                    select z.StateCode).Select(x => new SelectListItem
                                    {
                                        Text = x,
                                        Value = x
                                    }).Distinct().ToList();

            //If search criteria is null page is loading for the first time so send blank view OR
            if (String.IsNullOrWhiteSpace(search.searchZip) &&
                String.IsNullOrWhiteSpace(search.searchDate) &&
                String.IsNullOrWhiteSpace(search.searchState))
            {
                return View(search);
            }