2009-08-06 12 views
2

複数の商品を持つStoreクラスをHtml.Listboxにバインドしたいとします。 編集ストアモードでは、ストアの商品が選択されているすべての商品をHtml.Listboxに表示します。私はストアをバインドすることができませんでした。リストボックスへの製品MVCモデルILIST データをHtml.Listboxにバインドする

My class structure;

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

あなたの改正に基づき、多分あなたはあなたの選択リストを移入するコードでこれを必要とする:

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"))%> 
+0

Model.Productlistはすでに移入ドロップダウン。私の問題は、ListBox( "Products")はStore.Productsリストと関係がないことです。 – dasmod

+0

私はこの問題を理解していません。 Model.ProductListをどのように配置していますか? Model.Productsと一致する必要があり、そうでない場合、私はあなたがそれを移入するルーチンを変更する必要があると仮定することができます。 – grenade

+0

ok、Model.ProductListはです。 public MultiSelectList ProductList {get;セット; } データベースからProductListを取り込みます(データベース内のすべての商品) StoreProductテーブル(store_id、product_id)を持っています Store.Id = 1のeditviewの場合、Store.Products Listには多対多の製品があります。 私がここでやろうとしているのは、リストボックスにすべての製品をリストし、このリストボックスをStoreにバインドするモデルです。製品 – dasmod

3

StoreがあなたのModel

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

キーはListBoxSelectListとは異なる名前を付ける必要がありますということです!私はこれがASP.NET MVC 1.0のバグかどうかはわかりませんが(それはそうだと思います)、私は以前にそれを考え出していました。症状は、値が選択されていないことです。私はこれがあなたのために問題を解決してくれることを願っています。あなたはそのことを取り除くことができます。StoreEditViewクラスは不要です。

+0

StoreEditView.ProductList = new SelectList(_storeRepository.Stores.ToList()、 "Id"、 "Name"、1); が機能しませんでした。 – dasmod

+0

もちろんMultiSelectListが必要なので、動作しません。この回答を投稿した後、あなたの質問を編集しました。私の答えを変えさせてください。 :) –

0

入力いただきありがとうございます。 どちらのメソッドも機能しますが、ページを送信すると、mvcはデフォルトでオブジェクトをStoreオブジェクトにバインドすることはできません。 (。慣例ベースのオブジェクト・オブジェクト・マッパー)

私はAutoMapperを使用してこの問題を解決するために管理

関連する問題