web-dev-qa-db-fra.com

Affichage des données dans une SelectList dans ASP.NET Core

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>
6
EB.

(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)

  • Le 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).
  • Le asp-controller et asp-action les attributs ne s'appliquent pas à <select>
  • Vous ne proposez aucune option à votre <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

8
Dai

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

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();
    }
}