2016-10-03 1 views
2

J'ai essayé différentes approches. Je ne sais pas pourquoi mais mon SelectList/DropDown est vide. Il ne montre aucune donnée. Je ne suis pas sûr d'où je vais mal.Afficher des données dans une SelectList dans ASP.NET Core

J'ai une application principale ASP.NET. Entité Framework Core. Db d'abord. 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; } 
} 

Ceci est mon interface:

interface ICommodityRepository 
{ 
    IEnumerable<Commodity> GetAll(); 
} 

Mon dépôt:

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 Afficher/HTML Markup:

@model Lansing.BasisMap.Domain.Models.Commodity 

<li><select asp-for="@Model.Code" asp-controller="Commodities" asp-action="CommoditiesList"></select> </li>

Répondre

4

(je ne suis pas trop familier avec la balise syntaxe d'assistance dans ASP.NET de base, mais je vais le donner un coup de feu, tout le monde s'il vous plaît me corriger si je me trompe)

  • l'attribut asp-for="" n'a pas besoin du préfixe @ parce que je t n'est pas du code Razor, la valeur de l'attribut est déjà gérée par l'analyseur ASP.NET - vous en avez seulement besoin si vous utilisez une syntaxe C# qui est ambiguë avec le HTML (par ex. double citation).
  • Les attributs ne sont pas applicables asp-controller et asp-action à <select>
  • Vous ne fournissez pas toutes les options à votre <select>, utilisez l'attribut asp-items et fournissent IEnumerable<SelectListItem> ou une instance SelectList. Cela peut être passé à travers votre ViewModel ou (ma préférence) à travers ViewData (ou ViewBag).

En supposant qu'il 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 utilisé comme ceci:

<select asp-for"Model.Code" asp-items="@ViewData["items"]" /> 

Il y a beaucoup d'autres exemples dans cette annonce QA: Select Tag Helper in ASP.NET Core MVC

1

Il 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 le DI fonctionne.

public CommodityRepository(ltgwarehouseContext ltgwc) 
{ 
    context = ltgwc; 
} 

Ensuite, si vous voulez avoir automatiquement peuplé et injecté dans votre contrôleur, vous devez vous inscrire dans Startup.cs en utilisant l'une des méthodes services.Addxxx. Je recommande que vous donniez une lecture au DI documentation car il l'expliquera mieux que je peux.

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