私はいくつかの異なるアプローチを試しました。理由はわかりませんが、SelectList/DropDownが空です。データは表示されません。どこが間違っているのかわかりません。
ASP.NET Coreアプリがあります。 Entity Framework Core。 Db First。リポジトリパターンを使用しています。
これが私のモデルクラスです
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();
}
}
これは私のビュー/ HTMLマークアップです。
@model Lansing.BasisMap.Domain.Models.Commodity
<li><select asp-for="@Model.Code" asp-controller="Commodities" asp-action="CommoditiesList"></select> </li>
(私はASP.NET Coreのタグヘルパー構文にあまり詳しくありませんが、試してみます。誰かが間違っている場合は修正してください)
asp-for=""
属性は、Razorコードではないため、@
プレフィックスは必要ありません。属性値は、ASP.NETのパーサーによって既に処理されています-あいまいなC#構文を使用している場合にのみ必要ですHTML(例:二重引用符).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の投稿にはさらに多くの例があります: ASP.NET Core MVCのタグヘルパーを選択
これを試して:
ビューで:
<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; }
}
データベースをCommodityRepository
に注入していないことが原因である可能性があります。 DIを機能させるには、コンストラクターにパラメーターを追加する必要があります。
public CommodityRepository(ltgwarehouseContext ltgwc)
{
context = ltgwc;
}
次に、それを自動的に入力してコントローラに挿入する場合は、services.Addxxx
メソッドの1つを使用して、Startup.csに登録する必要があります。 DI文書 を読んで、私が説明するよりも上手に説明することをお勧めします。
最終的なコントローラーは次のようになります。
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();
}
}