【问题标题】:NULL REF error while populating SelectListItem from IEnumerable<T>从 IEnumerable<T> 填充 SelectListItem 时出现 NULL REF 错误
【发布时间】:2011-02-09 01:10:13
【问题描述】:

我有以下包含 IEnumerable(of AffiliateComponentTypeView) 属性的 ViewModel (TripSearchView),我必须使用此集合填充下拉列表。我编写了一个扩展类,它从 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&lt;AffiliateComponentTypeView&gt; ComponentTypes 正确填充了值,并且填充 SelectListItem 的逻辑正常工作。为什么我会收到 NULL Ref 错误?我错过了什么?

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

在调用视图之前,我在控制器操作中使用集合填充“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);

}

【问题讨论】:

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


    【解决方案1】:

    嗯,我可以想到三个选项:

    • Model.ComponentTypes 为空(你说不是,但我不得不假设 something 不是你想的那样)
    • Model.ComponentTypes 中的一个组件元素为空
    • 其中一个组件元素的ComponentDescComponent_Type 为空

    我注意到您没有在方法中使用selectedId 参数,顺便说一句...您是故意的吗? (由于某种原因,您也没有使用扩展方法这一事实......)

    【讨论】:

    • 乔恩,我已经通过添加我的控制器操作来编辑我的帖子,您可以看到“ComponentTypes”正在填充值,并且我在调试时已确定。为了确保,我还使用 SelectListItem 填充了 ViewData["ComponentTypesList"] 并且它确实填充了但是我的视图中出现了 Object Ref 错误。我目前没有使用 selectedId。我不确定您所说的“由于某种原因,您也没有使用扩展方法这一事实......”
    • 对不起乔恩。你们是对的,这是我的错。 “Model.TripSearch.ComponentType.ToString()”为 NULL,我将它作为 DropDown 名称的引用。
    【解决方案2】:
    <%: 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 不为空吗?您确定它自己的服务不会引发空引用异常吗?请记住,这些是 IEnumerable,因此可能会延迟执行。

    【讨论】:

    • Rene,我也尝试了你的建议,但仍然遇到同样的错误。
    • 对不起雷内。你们是对的,这是我的错。 “Model.TripSearch.ComponentType.ToString()”为 NULL,我将它作为 DropDown 名称的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多