Asp.net mvc MVC模型绑定IList<;T>;将数据转换为Html.Listbox
我想将具有多个产品的Store类绑定到Html.Listbox。 在编辑商店模式下,我希望Html.Listbox显示选择商店产品的所有产品。我无法将store.Products绑定到列表框 我的班级结构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
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)) %>