我尝试过几种不同的方法。我不确定为什么但我的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>
(我不太熟悉ASP.NET Core中的Tag Helper语法,但我会试一试,如果我错了,请任何人纠正我)
asp-for=""
属性不需要@
前缀,因为它不是Razor代码,属性值已经由ASP.NET的解析器处理 - 如果您使用的是与HTML不明确的C#语法(例如双引号),则只需要它。asp-controller
和asp-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
可能是因为你没有将数据库注入你的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();
}
}
试试这个:
在视图中:
<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; }
}