Asp.net mvc MVC模型绑定IList<;T>;将数据转换为Html.Listbox

Asp.net mvc MVC模型绑定IList<;T>;将数据转换为Html.Listbox,asp.net-mvc,listbox,Asp.net Mvc,Listbox,我想将具有多个产品的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

我想将具有多个产品的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>
}
公共类存储
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList产品{get;set;}
}
公共类产品
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
公共类StoreEditView
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList产品{get;set;}
公共虚拟MultiSelectList ProductList//从db填充,所有产品均以IList的形式
}
我的控制器

  public ViewResult Edit()
  {
    var editstore = new StoreEditView();
    editstore.Products = new List<Product> {new Product() {Id = 1, Name="Example"}};
    return View(editstore);
  }
公共视图结果编辑() { var editstore=new StoreEditView(); editstore.Products=new List{new Product(){Id=1,Name=“Example”}; 返回视图(editstore); } 我的观点

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

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



只是不起作用。

根据您的修订版,您可能需要在填充选择列表的代码中包含以下内容:

List<int> selectedValues = new List<int>();
foreach (Product p in store.Products)
    selectedValues.Add(p.Id);
var allProductList = new MultiSelectList(allProducts, "Id", "Title", selectedValues);
List selectedValues=new List();
foreach(产品p店内产品)
选择值。添加(p.Id);
var allProductList=新的多选列表(所有产品,“Id”、“标题”、选定值);
我将在下面留下我的原始答案,因为它将以更干净的方式解决问题

帮助程序Html.ListBox()希望向其传递IEnumerable,因此您需要将列表转换为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);
        }
    }
}
使用System.Collections.Generic;
使用System.Web.Mvc;
命名空间MvcMockups.Extensions
{
公共静态类扩展
{
公共静态SelectList到SelectList(此IEnumerable items、string dataValueField、string dataTextField、string selectedValue)
{
返回新的SelectList(项目、dataValueField、dataTextField、selectedValue);
}
}
}
您的视图需要了解您的扩展方法:

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

那么您的视图将包含:

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

假设
商店
是您的
型号

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

关键是
列表框
的名称必须与
选择列表
的名称不同!我不知道这是否是ASP.NET MVC 1.0中的一个bug(看起来是这样),但我以前也花了一些时间来解决它。症状是从未选择任何值。我希望这为您解决了这个问题,您可以摆脱我认为不必要的
StoreEditView
类。

感谢您的输入。 这两种方法都可以工作,但当您提交页面时,mvc无法在默认情况下对产品列表框进行建模绑定以存储对象


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

请参阅介绍如何绑定MVC listbox的文章:

Model.Productlist已填充下拉列表。我的问题是,ListBox(“产品”)与Store.Products list没有关系。我不确定我是否理解这个问题。如何填充Model.ProductList?如果它需要匹配Model.Products,而它没有匹配,那么我只能假设您需要更改填充它的例程;public MultiSelectList ProductList{get;set;}我从数据库(数据库中的所有产品)填充ProductList。如果在store.id=1,store.products列表的editview中,我有一个StoreProduct表(store\u id,product\u id)。我在这里试图做的是,将所有产品列在列表框中,并将此列表框绑定到Store.productssstoreeditview.ProductList=new SelectList(_storeRepository.Stores.ToList(),“Id”,“Name”,1);不起作用。当然不起作用,因为它希望现在有一个多选列表。在我发布此答案后,您编辑了您的问题。那么让我改变我的答案。:)
<%= Html.ListBox("ProductList",
        new SelectList(Model.Products, "Id", "Name", 1)) %>