在ASP.NET Core中的SelectList中显示数据

问题描述 投票:4回答:3

我尝试过几种不同的方法。我不确定为什么但我的SelectList / DropDown是空的。它没有显示数据。我不确定我哪里出错了。

我有一个ASP.NET核心应用程序。实体框架核心。 Db首先。我正在使用存储库模式。

这是我的模型类

public partial class Commodity
{
    public Guid Oid { get; set; }
    public string Code { get; set; }
}

这是我的界面:

interface ICommodityRepository
{
    IEnumerable<Commodity> GetAll();
}

我的存储库:

public class CommodityRepository : ICommodityRepository
{
    private ltgwarehouseContext context;

    public CommodityRepository()
    { }

    public IEnumerable<Commodity> GetAll()
    {
        return context.Commodity.ToList();
    }
}

我的控制器:

public class CommoditiesController : Controller
{
    static readonly CommodityRepository commodities = new CommodityRepository();

    public CommoditiesController(CommodityRepository commodities)
    { }

    // GET: /<controller>/
    public IEnumerable<Commodity> CommoditiesList()
    {
        return commodities.GetAll();
    }
}

这是我的View / HTML Markup:

@model Lansing.BasisMap.Domain.Models.Commodity

<li><select asp-for="@Model.Code" asp-controller="Commodities" asp-action="CommoditiesList"></select> </li>
c# asp.net-mvc asp.net-core ienumerable selectlist
3个回答
7
投票

(我不太熟悉ASP.NET Core中的Tag Helper语法,但我会试一试,如果我错了,请任何人纠正我)

  • asp-for=""属性不需要@前缀,因为它不是Razor代码,属性值已经由ASP.NET的解析器处理 - 如果您使用的是与HTML不明确的C#语法(例如双引号),则只需要它。
  • asp-controllerasp-action属性不适用于<select>
  • 您没有为<select>提供任何选项,请使用asp-items属性并提供IEnumerable<SelectListItem>SelectList实例。这可以通过你的ViewModel或(我的偏好)通过ViewData(或ViewBag)传递。

假设它是ViewData,那么:

public ActionResult YourControllerAction() {

    // stuff
    this.ViewData["items"] = commodities
        .GetAll()
        .Select( c => new SelectListItem() { Text = c.Code, Value = c.Oid.ToString() } )
        .ToList();

    // stuff
    return this.View( viewModel );
}

并在这个视图中使用它:

<select asp-for="Model.Code" asp-items="@ViewData["items"]" />

在QA帖子中有更多的例子:Select Tag Helper in ASP.NET Core MVC


1
投票

可能是因为你没有将数据库注入你的CommodityRepository。您需要将参数添加到构造函数中才能使DI工作。

public CommodityRepository(ltgwarehouseContext ltgwc)
{
    context = ltgwc;
}

然后,如果要将其自动填充并注入控制器,则需要使用其中一种services.Addxxx方法在Startup.cs中注册它。我建议你给DI documentation一个阅读,因为它会比我更好地解释它。

你的最终控制器应该是这样的:

public class CommoditiesController : Controller
{
    //Declare the local variable
    ICommodityRepository _commodities;
    //Load the repository via DI
    public CommoditiesController(CommodityRepository commodities)
    {
        //Set the local variable to the injected one
        _commodities = commodities;
    }

    // GET: /<controller>/
    public IEnumerable<Commodity> CommoditiesList()
    {
        //Reference the local variable in your methods
        return _commodities.GetAll();
    }
}

1
投票

试试这个:

在视图中:

<select asp-for="Staff.CityID" asp-items="@Model.CityList"></select>

在控制器中:

public IActionResult Create()
        {
            StaffViewModel model = new StaffViewModel();
            model.CityList = new List<SelectListItem>
            {
                new SelectListItem {Text = "İstanbul", Value = "1"},
                new SelectListItem {Text = "Sivas", Value = "2"}
            };

            return View(model);
        }

在模型中:

public class StaffViewModel
    {
        public  Staff Staff { get; set; }
        public  List<SelectListItem> CityList { get; set; }
    }
© www.soinside.com 2019 - 2024. All rights reserved.