IEnumerable <t>项目返回NULL

时间:2019-04-29 06:26:51

标签: c# asp.net-core

我有一个IEnumerableExtensional类,需要返回项目列表

public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, int selectedValue)
        {
            return from item in items
                   select new SelectListItem
                   {
                       Text = item.GetPropertyValue("Ime"),
                       Value = item.GetPropertyValue("Id"),
                       Selected = item.GetPropertyValue("Id").Equals(selectedValue.ToString())
                   };
        }

无论何时选择下拉列表并提交表单,我都会得到NULLReferenceException。

到目前为止,我尝试按照以下方式进行初始化

IEnumerable<object> items = new IEnumerable<items>();

但这不起作用。 我做错了什么?

更新

下拉菜单

<div class="form-group row">
            <div class="col-3">
                <text>Vrsta vozila</text>
            </div>
            <div class="col-5">
                <select asp-for="@Model.Garancija.VrsteVozilaID" asp-items="@Model.VrstaVozila.ToSelectListItem(Model.Garancija.VrsteVozilaID)" class="form-control"></select>
            </div>
        </div>

通过项目的IReflection方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Project.Extensions
{
    public static class ReflectionExtension
    {
        public static string GetPropertyValue<T>(this T item,string propertyName)
        {
            return item.GetType().GetProperty(propertyName).GetValue(item, null).ToString();
        }
    }
}

VrsteVozila模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace Project.Models
{
    public class VrstaVozila
    {

        public int Id { get; set; }

        [Required]
        [MaxLength(20)]
        public string Ime { get; set; }
    }
}

此后,我创建ViewModel以显示所有下拉菜单

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Project.Models.ViewModels
{
    public class GarancijaViewModel
    {
        public ProduzenaGarancija Garancija { get; set; }

        public IEnumerable<Cjenovnik> Cijenovnik { get; set; }
        public IEnumerable<Gorivo> Gorivo { get; set; }
        public IEnumerable<MarkeVozila> MarkeVozila { get; set; }
        public IEnumerable<ModeliVozila> ModeliVozila { get; set; }
        public IEnumerable<Produkt> Produkt { get; set; }
        public IEnumerable<VrstaMjenjaca> VrstaMjenjaca { get; set; }
        public IEnumerable<VrstaVozila> VrstaVozila { get; set; }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想将空值作为一个空的可枚举值,我建议采用以下解决方案:

public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, int selectedValue)
{
    if (items === null) return Enumerable.Empty<T>();

    return items.Select(item => new SelectListItem {
        Text = item.GetPropertyValue("Ime"),
        Value = item.GetPropertyValue("Id"),
        Selected = item.GetPropertyValue("Id").Equals(selectedValue.ToString())
    });
}