在我的应用程序中,我有几个下拉菜单,这些菜单是使用ExtensionMethod填充的。调试应用程序后,我注意到如果我选择value,IEnumerable项将显示为空
public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, int selectedValue)
{
return (items == null)
? (IEnumerable<SelectListItem>)Enumerable.Empty<T>()
: items.Select(item => new SelectListItem
{
Text = item.GetPropertyValue("Ime"),
Value = item.GetPropertyValue("Id"),
Selected = item.GetPropertyValue("Id").Equals(selectedValue.ToString())
});
}
选择值之后,我创建了一个名为ReflectionExtension的新方法,该方法传递名称和ID
public static class ReflectionExtension
{
public static string GetPropertyValue<T>(this T item,string propertyName)
{
return item.GetType().GetProperty(propertyName).GetValue(item).ToString();
}
}
在视图方法中,我调用SelectListItem
<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>
<div class="form-group row">
<div class="col-3">
<text>Marka Vozila</text>
</div>
<div class="col-5">
<select asp-for="@Model.Garancija.MarkaVozilaID" asp-items="Model.MarkeVozila.ToSelectListItem(Model.Garancija.MarkaVozilaID)" class="form-control"></select>
</div>
</div>
我提交表单后出现此错误
我通过使用View-Model创建下拉菜单来获取此数据
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; }
}
用于将所有字段保存到数据库的控制器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TriglavOsiguranje.Data;
using TriglavOsiguranje.Models.ViewModels;
namespace TriglavOsiguranje.Areas.Uposlenik.Controllers
{
[Area("Uposlenik")]
public class GarancijaController : Controller
{
private readonly ApplicationDbContext _db;
[BindProperty]
public GarancijaViewModel GarancijaVM { get; set; }
public GarancijaController(ApplicationDbContext db)
{
_db = db;
GarancijaVM = new GarancijaViewModel()
{
Gorivo = _db.Gorivo.ToList(),
Cijenovnik = _db.Cjenovnik.ToList(),
MarkeVozila = _db.MarkeVozila.ToList(),
ModeliVozila = _db.Modeli.ToList(),
Produkt = _db.Produkti.ToList(),
VrstaMjenjaca = _db.VrsteMjenjaca.ToList(),
VrstaVozila = _db.VrsteVozila.ToList(),
Garancija = new Models.ProduzenaGarancija()
};
}
public async Task<IActionResult> Index()
{
var garancija = _db.Garancija.Include(m => m.MarkaVozila).Include(m => m.ModelVozila).Include(m => m.VrsteVozila);
return View(await garancija.ToListAsync());
}
//GET : Product Create
public IActionResult Create()
{
return View(GarancijaVM);
}
[HttpPost,ActionName("Create")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreatePOST()
{
if(!ModelState.IsValid)
{
return View(GarancijaVM);
}
_db.Garancija.Add(GarancijaVM.Garancija);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
}
我不知道我在哪里犯了错误。由于IEnumerable因为是接口而无法初始化,所以我不知道如何解决此常见问题? 有什么建议吗??