我的应用程序正在使用Asp.Net Core。 EF核心。我正在使用ViewModel,而不是EF模型和存储库模式。我的视图模型我自己创建。它没有连接到EF或任何东西。也许这就是我出错的地方?
编辑新的ViewModel:
public partial class CommodityViewModel
{
public CommodityViewModel()
{
}
public IEnumerable<SelectListItem> CommoditiesItems { get; set; }
public Guid Oid { get; set; }
public string Code { get; set; }
public string Description { get; set; }
}
编辑:新界面 这是我的界面:
public interface ICommodityRepository
{
IEnumerable<CommodityViewModel> GetCommodities();
}
我的界面上的问题是我可以将IEnumerable用于列表或选择列表吗?
编辑新存储库:
public class CommodityRepository : ICommodityRepository
{
private readonly CommodityViewModel _context;
public CommodityRepository(CommodityViewModel context)
{
_context = context;
}
public IEnumerable<CommodityViewModel> GetCommodities()
{
return _context.CommoditiesList.ToList();
}
}
这是我的控制器:
public class CommoditiesController : Controller
{
private readonly ICommodityRepository _commoditiyRepository;
public CommoditiesController(ICommodityRepository commodityRepository)
{
_commoditiyRepository = commodityRepository;
}
public IActionResult CommoditiesList()
{
return View(_commoditiyRepository.GetCommodities());
}
}
我使用布局显示下拉列表的视图,因为我希望每个页面都可以访问它。 (我知道我应该把它放在局部视图中。我只是想让它先工作。):
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-bell"></i> <b class="caret"></b></a>
<ul class="dropdown-menu alert-dropdown">
<li>
<select asp-for="Code" asp-items="@(new SelectList(Model.CommoditiesList,"Code","Description"))">
<option>Please select one</option>
</select>
</li>
</ul>
</li>
以下是我无法解决的错误:
NullReferenceException:未将对象引用设置为对象的实例。 在_Layout.cshtml第134行中的MoveNext
<!-- Here: Line 134--><select asp-for="Code" asp-items="@(new SelectList(Model.CommoditiesList,"Code","Description"))">
<option>Please select one</option>
</select>
我真的不知道我哪里出错了。我在存储库方法中实例化了一个新列表。我甚至在ViewModel中实例化了一个新的List。有人能指出我正确的方向吗?感谢。
答案 0 :(得分:0)
SelectListItem是一个UI问题,所以你的存储库不应该返回它,它应该返回IEnumerable或List,你将它转换为控制器中的IEnumerable或List of SelectListItem。
我在项目中使用TimeZones列表做了类似的事情。 ViewModel具有IEnumerable的SelectListItem属性,我的数据来自只读集合。我的代码是这样的:
model.TimeZoneId = selectedSite.TimeZoneId;
model.AllTimeZones = tzHelper.GetTimeZoneList().Select(x =>
new SelectListItem
{
Text = x,
Value = x,
Selected = model.TimeZoneId == x
});
我的剃刀视图是这样的:
<div class="form-group">
<label asp-for="TimeZoneId" class="col-md-2 control-label">@sr["Time Zone"]</label>
<div class="col-md-10">
<select asp-for="TimeZoneId"
asp-items="Model.AllTimeZones" class="form-control"></select>
<span asp-validation-for="TimeZoneId" class="text-danger"></span>
</div>
</div>