我想将具有多个Products的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)%>
只是没有用。
答案 0 :(得分:3)
假设Store
是Model
:
<%= Html.ListBox("ProductList",
new SelectList(Model.Products, "Id", "Name", 1)) %>
关键是ListBox
的名称必须与SelectList
不同!我不知道这是否是ASP.NET MVC 1.0中的一个错误(它看起来如此),但我也花了一些时间来搞清楚它。症状是没有选择任何值。我希望这能解决你的问题,你可以摆脱StoreEditView
课程,我觉得这是不必要的。
答案 1 :(得分:3)
请参阅描述如何绑定MVC列表框的文章: http://www.altafkhatri.com/Technical/How_to_bind_IList_with_MVC_Dropdownlist_box
答案 2 :(得分:0)
根据您的修订版,您可能需要填写选择列表的代码:
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"))%>
答案 3 :(得分:0)
感谢您的投入。 这两种方法都有效,但是当您提交页面时 - 默认情况下,mvc无法将产品列表框绑定到Store对象。
我设法通过使用AutoMapper(基于约定的对象 - 对象映射器)解决了这个问题。