从IEnumerable <t> </t>填充SelectListItem时出现NULL REF错误

时间:2011-02-08 14:45:38

标签: asp.net asp.net-mvc-2

我有以下ViewModel(TripSearchView),其中包含IEnumerable(AffiliateComponentTypeView)属性,我必须使用此集合填充下拉列表。我编写了一个扩展类,它从IEnumerable属性填充SelectListItem。

public class TripSearchView
{
    public IEnumerable<AffiliateComponentTypeView> ComponentTypes { get; set; } 
    //More fields...
}
public static class DropDownHelper
{
    public static IEnumerable<SelectListItem> ToSelectListItems(
                  this IEnumerable<AffiliateComponentTypeView> componentTypes, int selectedId)
    {
        return
            componentTypes.Select(componentType =>
                      new SelectListItem
                      {
                          Text = componentType.ComponentDesc,
                          Value = componentType.Component_Type
                      });
    }

}

这就是我在我的aspx中调用它的方法,但是我得到了Html.DropDownList的第二个参数的NULL REFERENCE错误。我已确保IEnumerable<AffiliateComponentTypeView> ComponentTypes正确填充了值,并且填充SelectListItem的逻辑正常工作。为什么我收到NULL Ref错误?我错过了什么?

<%= Html.DropDownList(Model.TripSearch.ComponentType.ToString(), DropDownHelper.ToSelectListItems(Model.TripSearch.ComponentTypes,0))%>

在调用View之前,我在控制器操作中使用集合填充“ComponentTypes”。

public ActionResult Index()
{
    SearchView SearchView = new SearchView();
    TripSearchView TripSearchView = new TripSearchView();
    TripSearchView.ComponentTypes = _referenceDataService.AffiliateComponentTypes(base.GetAffiliateID());
    SearchView.TripSearch = TripSearchView;

    ViewData["ComponentTypesList"] = _referenceDataService.AffiliateComponentTypes(base.GetAffiliateID()).Select(componentType =>
                  new SelectListItem
                  {
                      Text = componentType.ComponentDesc,
                      Value = componentType.Component_Type
                  });

    return View(SearchView);

}

2 个答案:

答案 0 :(得分:1)

好吧,我可以想到三个选择:

  • Model.ComponentTypes为空(你说它不是,但我必须假设某些不是你认为的那样)
  • Model.ComponentTypes中的一个组成元素为null
  • 其中一个组件元素具有空ComponentDescComponent_Type

我注意到你没有在方法中使用selectedId参数,顺便说一下......你的意思是? (你也没有使用你有扩展方法的事实,出于某种原因......)

答案 1 :(得分:0)

<%: Html.DropDownList(
Model.ComponentType.ToString(), 
Model.TripSearch.ComponentTypes.ToSelectListItems(0))
%> 

在你的DropDownHelper

    return componentTypes.Select(
      componentType =>
         new SelectListItem 
            { Text = componentType==null?"empty":ComponentType.ComponentDesc,
              Value = componentType==null?"empty":componentType.Component_Type
            })

您确定base.GetAffiliationId不为空吗?你确定它自己的服务不会抛出空的refence异常吗?请记住,这些是IEnumerable,因此可能会被执行。