列表或选择列表保持返回对象引用错误

时间:2016-10-17 13:47:36

标签: c# entity-framework drop-down-menu asp.net-core selectlistitem

我的应用程序正在使用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。有人能指出我正确的方向吗?感谢。

1 个答案:

答案 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>