2009-08-06 6 views
2

Я хочу связать свой класс Store, который имеет несколько продуктов для Html.Listbox. В режиме «Сохранить в магазине» я хочу, чтобы Html.Listbox показывал все продукты, в которых выбраны продукты Магазина. Я не смог связаться с магазином. Продукты в спискеMVC Model Binding IList <T> данные в 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); 
    } 

My View;

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

В этом случае мне нужен продукт. Идентификатор = 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 («Продукты») не имеет отношения к списку Store.Products. – dasmod

+0

Я не уверен, что понимаю проблему. Как вы заполняете Model.ProductList? Если ему нужно сопоставить Model.Products, а это не так, я могу только предположить, что вам нужно изменить процедуру, которая заполняет ее. – grenade

+0

ok, Model.ProductList; Публичный продукт MultiSelectList ProductList {get; задавать; } Я заполняю ProductList из базы данных (все продукты в базе данных) У меня есть таблица StoreProduct (store_id, product_id) Если в editview для Store.Id = 1, Store.Products List имеет много ко многим. То, что я пытаюсь сделать здесь, Перечислить все продукты в список и модель привязать этот список к Store.Products – dasmod

3

Предполагая, что Store является вашим Model:

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

Ключ в том, что ListBox должен быть назван иначе, чем SelectList! Я не знаю, является ли это ошибкой в ​​ASP.NET MVC 1.0 (это выглядит так), но я также потратил некоторое время на то, чтобы понять это раньше. Симптом заключается в том, что никакая ценность никогда не выбирается. Я надеюсь, что это решает проблему для вас, и вы можете избавиться от этого класса StoreEditView, который я считаю ненужным.

+0

StoreEditView.ProductList = новый SelectList (_storeRepository.Stores.ToList(), "Id", "Name", 1); не работает. – dasmod

+0

Конечно, он не работает, так как теперь он ожидает MultiSelectList. Вы отредактировали свой вопрос после того, как я разместил этот ответ. Позвольте мне изменить свой ответ. :) –

0

Спасибо за ваши данные. Оба метода работают, но когда вы отправляете страницу - mvc не может смоделировать привязку списка товаров для сохранения объекта по умолчанию.

мне удалось решить эту проблему с помощью AutoMapper