MVC3 Razor @Html.DropDownListFor

2020-02-02 07:53发布

I could use some help implementing @Html.DropDownListFor. My objective is to filter the list of Products by Category.

This code will display a list box:

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

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

But I'm having trouble getting @Html.DropDownListFor to work:

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

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

I could use some help constructing the Linq portion of @Html.DropDownListFor. Here is the model:

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

}

3条回答
够拽才男人
2楼-- · 2020-02-02 08:38

My recommendation:

Extend your LINQ data context class with a static function to return a SelectList of all categories, and use Html.DropDownList() to display this list.

Then, add a controller for this same Action that accepts category ID and return the IEnumerable<Product> list that corresponds to that category.

查看更多
成全新的幸福
3楼-- · 2020-02-02 08:53

here is another way to do what you want.

In the model I have two entries

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

I then populate the SelectlestItem either from a database or statically. In the Index.cs controller

   product model = new product();

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

   return View(model);

In the View

    @using (Html.BeginForm("Edit", "Subject", FormMethard.Post, new { id = "genform"}))
    {
       <div class="vertical-space spaced-field">@Html.DropDownListFor(m => m.CategoryID, model,Category)</div>
查看更多
冷血范
4楼-- · 2020-02-02 08:55

Your view is strongly typed to a collection of products so I suppose that you need a drop down for each product. If this is the case an editor template would work:

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

And then inside ~/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)
查看更多
登录 后发表回答