J'ai essayé quelques approches différentes. Je ne sais pas pourquoi mais ma SelectList/DropDown est vide. Il ne montre aucune donnée. Je ne sais pas où je vais mal.
J'ai une application ASP.NET Core. Entity Framework Core. Db First. J'utilise un modèle de référentiel.
Voici ma classe modèle
public partial class Commodity
{
public Guid Oid { get; set; }
public string Code { get; set; }
}
Voici mon interface:
interface ICommodityRepository
{
IEnumerable<Commodity> GetAll();
}
Mon référentiel:
public class CommodityRepository : ICommodityRepository
{
private ltgwarehouseContext context;
public CommodityRepository()
{ }
public IEnumerable<Commodity> GetAll()
{
return context.Commodity.ToList();
}
}
Mon contrôleur:
public class CommoditiesController : Controller
{
static readonly CommodityRepository commodities = new CommodityRepository();
public CommoditiesController(CommodityRepository commodities)
{ }
// GET: /<controller>/
public IEnumerable<Commodity> CommoditiesList()
{
return commodities.GetAll();
}
}
Ceci est mon affichage/balisage HTML:
@model Lansing.BasisMap.Domain.Models.Commodity
<li><select asp-for="@Model.Code" asp-controller="Commodities" asp-action="CommoditiesList"></select> </li>
(Je ne connais pas trop la syntaxe de Tag Helper dans ASP.NET Core, mais je vais essayer, quiconque me corrige si je me trompe)
asp-for=""
l'attribut n'a pas besoin de @
préfixe car ce n'est pas du code Razor, la valeur d'attribut est déjà gérée par l'analyseur ASP.NET - vous n'en avez besoin que si vous utilisez une syntaxe C # ambiguë avec HTML (par exemple, les guillemets doubles).asp-controller
et asp-action
les attributs ne s'appliquent pas à <select>
<select>
, Utilisez le asp-items
attribut et fournir IEnumerable<SelectListItem>
ou une instance SelectList
. Cela peut être transmis via votre ViewModel
ou (ma préférence) via ViewData
(ou ViewBag
).En supposant que c'est ViewData
, alors:
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 );
}
Et utilisez-le en vue comme ceci:
<select asp-for="Model.Code" asp-items="@ViewData["items"]" />
Il y a beaucoup plus d'exemples dans cette publication QA: Sélectionnez Tag Tagper dans ASP.NET Core MVC
Essaye ça:
En vue:
<select asp-for="Staff.CityID" asp-items="@Model.CityList"></select>
Dans le contrôleur:
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);
}
Dans le modèle:
public class StaffViewModel
{
public Staff Staff { get; set; }
public List<SelectListItem> CityList { get; set; }
}
C'est peut-être parce que vous n'injectez pas la base de données dans votre CommodityRepository
. Vous devez ajouter le paramètre au constructeur pour que la DI fonctionne.
public CommodityRepository(ltgwarehouseContext ltgwc)
{
context = ltgwc;
}
Ensuite, si vous souhaitez qu'il soit automatiquement rempli et injecté dans votre contrôleur, vous devez l'enregistrer dans Startup.cs en utilisant l'un des services.Addxxx
méthodes. Je vous recommande de lire la documentation DI car elle l'expliquera mieux que moi.
Votre contrôleur final devrait ressembler à ceci:
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();
}
}