2009-08-06 8 views
2

Je veux lier ma classe Store qui a plusieurs produits à Html.Listbox. En mode édition, je souhaite que Html.Listbox affiche tous les produits dans lesquels les produits du magasin sont sélectionnés. Je n'ai pas réussi à lier store.Products à la liste déroulanteLiaison de modèle MVC IList <T> données à Html.Listbox

Ma structure de classe;

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> 
} 

Mon contrôleur;

public ViewResult Edit() 
    { 
    var editstore = new StoreEditView(); 
    editstore.Products = new List<Product> {new Product() {Id = 1, Name="Example"}}; 
    return View(editstore); 
    } 

Mes vues;

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

Dans ce cas, j'ai besoin d'afficher product.Id = 1 dans la zone de liste. Jusqu'à présent, je ne pouvais pas le faire. J'ai essayé,

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

n'a pas fonctionné.

Répondre

0

Sur la base de votre révision, peut-être vous avez besoin ce dans le code qui renseigne votre liste de sélection:

List<int> selectedValues = new List<int>(); 
foreach (Product p in store.Products) 
    selectedValues.Add(p.Id); 
var allProductList = new MultiSelectList(allProducts, "Id", "Title", selectedValues); 

Je vais laisser ma première réponse ci-dessous, car il résoudrait le problème de façon plus propre.

L'assistant Html.ListBox() veut qu'un IEnumerable lui soit passé. Vous devez donc convertir votre liste en celle-ci afin de remplir la zone de liste.

Vous pouvez accomplir cela avec une méthode d'extension comme ceci:

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); 
     } 
    } 
} 

Votre vue aura besoin de savoir au sujet de votre méthode d'extension:

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

Ensuite, votre vue contiendraient:

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

Model.Productlist déjà remplit la liste déroulante. Mon problème est, ListBox ("Produits") n'ont aucune relation avec la liste Store.Products. – dasmod

+0

Je ne suis pas sûr de comprendre le problème. Comment peuples-tu Model.ProductList? S'il doit correspondre à Model.Products et non, alors je ne peux que supposer que vous devez changer la routine qui le remplit. – grenade

+0

ok, Model.ProductList est; public MultiSelectList ProductList {get; ensemble; } Je remplis ProductList à partir de la base de données (tous les produits dans la base de données) J'ai une table StoreProduct (store_id, product_id) Si dans editview pour Store.Id = 1, Store.Products List a plusieurs-à-plusieurs produits. Ce que j'essaie de faire ici est, Liste tous les produits dans la liste et le modèle lier cette Listbox à Store.Products – dasmod

3

En supposant que Store est votre Model:

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

La clé est que le ListBox doit être nommé différemment que le SelectList! Je ne sais pas s'il s'agit d'un bogue dans ASP.NET MVC 1.0 (il semble) mais j'ai aussi passé du temps à le comprendre avant. Le symptôme est qu'aucune valeur n'est jamais sélectionnée. J'espère que cela résout le problème pour vous et vous pouvez vous débarrasser de cette classe StoreEditView, ce qui je pense est inutile.

+0

StoreEditView.ProductList = new SelectList (_storeRepository.Stores.ToList(), "Id", "Nom", 1); ne fonctionnait pas. – dasmod

+0

Bien sûr, cela ne fonctionne pas, car il attend une MultiSelectList maintenant. Vous avez modifié votre question après avoir posté cette réponse. Permettez-moi de changer ma réponse alors. :) –

0

Merci pour vos commentaires. Les deux méthodes fonctionnent, mais lorsque vous soumettez la page, mvc ne peut pas modéliser lier la liste de produits à l'objet Store par défaut.

j'ai réussi à résoudre ce problème en utilisant AutoMapper

Questions connexes