MVC模型将IList <t>数据绑定到Html.Listbox </t>

时间:2009-08-06 12:52:39

标签: asp.net-mvc listbox

我想将具有多个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)%>

只是没有用。

4 个答案:

答案 0 :(得分:3)

假设StoreModel

<%= 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(基于约定的对象 - 对象映射器)解决了这个问题。