【问题标题】:MVC Model Binding IList<T> data to Html.ListboxMVC 模型将 IList<T> 数据绑定到 Html.Listbox
【发布时间】:2009-08-06 12:52:38
【问题描述】:

我想将具有多个产品的 Store 类绑定到 Html.Listbox。 在编辑商店模式下,我希望 Html.Listbox 显示选择商店产品的所有产品。我无法将 store.Products 绑定到列表框

我的班级结构;

public class Store
{
   public virtual int Id { get; set; }  
   public virtual string Name { get; set; }       
   public virtual IList<Product> Products { get; set; }
}
public class Product
{
   public virtual int Id { get; set; }  
   public virtual string Name { get; set; }       
}
public class StoreEditView
{
   public virtual int Id { get; set; }  
   public virtual string Name { get; set; }       
   public virtual IList<Product> Products { get; set; }
   public virtual MultiSelectList ProductList //populated from db, all products in the form of IList<Product>
}

我的控制器;

  public ViewResult Edit()
  {
    var editstore = new StoreEditView();
    editstore.Products = new List<Product> {new Product() {Id = 1, Name="Example"}};
    return View(editstore);
  }

我的观点;

 <%=Html.ListBox("Products", Model.ProductList)%>

在这种情况下,我需要 product.Id=1 在列表框中显示为选中状态。到目前为止我做不到。 我试过了,

<%=Html.ListBox("Product.Id", Model.ProductList)%>
<%=Html.ListBox("Products.Id", Model.ProductList)%>

只是没用。

【问题讨论】:

    标签: asp.net-mvc listbox


    【解决方案1】:

    假设Store 是你的Model

    <%= Html.ListBox("ProductList",
            new SelectList(Model.Products, "Id", "Name", 1)) %>
    

    关键是ListBox 的命名必须与SelectList 不同!我不知道这是否是 ASP.NET MVC 1.0 中的一个错误(看起来如此),但我之前也花了一些时间弄清楚它。症状是从未选择任何值。我希望这可以为您解决问题,并且您可以摆脱 StoreEditView 类,我认为这是不必要的。

    【讨论】:

    • StoreEditView.ProductList = new SelectList(_storeRepository.Stores.ToList(), "Id", "Name",1);没用。
    • 当然不行,因为它现在需要一个 MultiSelectList。在我发布此答案后,您编辑了您的问题。那我换个答案吧。 :)
    【解决方案2】:

    请参考描述如何绑定 MVC 列表框的文章: http://www.altafkhatri.com/Technical/How_to_bind_IList_with_MVC_Dropdownlist_box

    【讨论】:

      【解决方案3】:

      根据您的修订,您可能需要在填充您的选择列表的代码中使用它:

      List<int> selectedValues = new List<int>();
      foreach (Product p in store.Products)
          selectedValues.Add(p.Id);
      var allProductList = new MultiSelectList(allProducts, "Id", "Title", selectedValues);
      

      我将在下面留下我原来的答案,因为它会以更简洁的方式解决问题。

      Html.ListBox() 帮助器希望将 IEnumerable 传递给它,因此您需要将列表转换为该列表以填充列表框。

      您可以使用这样的扩展方法来完成此操作:

      using System.Collections.Generic;
      using System.Web.Mvc;
      
      namespace MvcMockups.Extensions
      {
          public static class Extensions
          {
              public static SelectList ToSelectList<T>(this IEnumerable<T> items, string dataValueField, string dataTextField, string selectedValue)
              {
                  return new SelectList(items, dataValueField, dataTextField, selectedValue);
              }
          }
      }
      

      你的视图需要知道你的扩展方法:

      <%@ Import Namespace="MvcMockups.Extensions"%>
      

      那么您的视图将包含:

      <%= Html.ListBox("Product", Model.Products.ToSelectList("Id", "Name", "1"))%>
      

      【讨论】:

      • Model.Productlist 已填充下拉列表。我的问题是,ListBox("Products") 与 Store.Products 列表没有关系。
      • 我不确定我是否理解问题所在。你是如何填充 Model.ProductList 的?如果它需要匹配 Model.Products 而它不匹配,那么我只能假设您需要更改填充它的例程。
      • 好的,Model.ProductList 是;公共 MultiSelectList 产品列表 { 获取;放;我从数据库(数据库中的所有产品)填充 ProductList 我有一个 StoreProduct 表(store_id,product_id) 如果在 Store.Id=1 的编辑视图中,Store.Products List 有多对多的产品。我在这里要做的是,将所有产品列出到 Listbox 中,并将此 Listbox 模型绑定到 Store.Products
      【解决方案4】:

      感谢您的意见。 这两种方法都有效,但是当您提交页面时 - 默认情况下,mvc 无法将产品列表框绑定到 Store 对象。

      我设法通过使用 AutoMapper(基于约定的对象-对象映射器)解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多