web-dev-qa-db-ja.com

ASP.NET CoreのSelectListでのデータの表示

私はいくつかの異なるアプローチを試しました。理由はわかりませんが、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>
6
EB.

(私は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のタグヘルパーを選択

8
Dai

これを試して:

ビューで:

<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; }
    }
3
codelover

データベースを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();
    }
}