web-dev-qa-db-fra.com

MVC3 Razor @ Html.DropDownListFor

Je pourrais utiliser de l'aide pour implémenter @ Html.DropDownListFor. Mon objectif est de filtrer la liste des produits par catégorie.

Ce code affichera une zone de liste:

@model IEnumerable<Sample.Models.Product>
@{
    List<Sample.Models.Category> list = ViewBag.Categories;
    var items = new SelectList(list, "CategoryID", "CategoryName");

}
@Html.DropDownList("CategoryID", items)

Mais j'ai du mal à obtenir @Html.DropDownListFor travailler:

@model IEnumerable<Sample.Models.Product>
@{
    List<Sample.Models.Category> list = ViewBag.Categories;
    var items = new SelectList(list, "CategoryID", "CategoryName");

}
@Html.DropDownListFor(???, @items)

Je pourrais utiliser de l'aide pour construire la partie Linq de @Html.DropDownListFor. Voici le modèle:

public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public int CategoryID { get; set; }
    public string QuantityPerUnit { get; set; }
    public Decimal? UnitPrice { get; set; }
    public short UnitsInStock { get; set; }

    public virtual Category Category { get; set; }
}

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }

    public virtual ICollection<Product> Products { get; set; }

}
26
user625351

Votre vue est fortement typée pour une collection de produits, donc je suppose que vous avez besoin d'une liste déroulante pour chaque produit. Si tel est le cas, un modèle d'éditeur fonctionnerait:

@model IEnumerable<Sample.Models.Product>
@Html.EditorForModel()

Et puis à l'intérieur ~/Views/Shared/EditorTemplates/Product.cshtml

@model Sample.Models.Product
@{
    List<Sample.Models.Category> list = ViewBag.Categories;
    var items = new SelectList(list, "CategoryID", "CategoryName");
}
@Html.DropDownListFor(x => x.CategoryID, @items)
47
Darin Dimitrov

Ma recommandation:

Étendez votre classe de contexte de données LINQ avec une fonction statique pour renvoyer un SelectList de toutes les catégories et utilisez Html.DropDownList() pour afficher cette liste.

Ensuite, ajoutez un contrôleur pour cette même action qui accepte l'ID de catégorie et renvoyez le IEnumerable<Product> liste qui correspond à cette catégorie.

2
Keith

voici une autre façon de faire ce que vous voulez.

Dans le modèle, j'ai deux entrées

  public class Product
  {
     public int CategoryID { get; set; }
     public IEnumerable<SelectListItem> Category { get; set; }
  }

Je remplis ensuite le SelectlestItem à partir d'une base de données ou de manière statique. Dans le contrôleur Index.cs

   product model = new product();

   model.Category = <whereever you generated the data>;

   return View(model);

Dans la vue

    @using (Html.BeginForm("Edit", "Subject", FormMethard.Post, new { id = "genform"}))
    {
       <div class="vertical-space spaced-field">@Html.DropDownListFor(m => m.CategoryID, model,Category)</div>
0
user1181334