Связывание модели MVC IList <T>данных с Html.Listbox - PullRequest
2 голосов
/ 06 августа 2009

Я хочу связать свой класс Store с несколькими товарами с Html.Listbox. Находясь в режиме редактирования Магазина, я хочу, чтобы Html.Listbox показывал все товары, где выбраны товары Магазина. Мне не удалось связать магазин. Товары в списке

Моя классовая структура;

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)%>

В этом случае мне нужно, чтобы product.Id = 1 отображался выбранным в списке. До сих пор я не мог этого сделать. Я пытался,

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

просто не работал.

Ответы [ 4 ]

3 голосов
/ 03 октября 2009

Пожалуйста, обратитесь к статье, которая описывает, как связать список MVC: http://www.altafkhatri.com/Technical/How_to_bind_IList_with_MVC_Dropdownlist_box

3 голосов
/ 06 августа 2009

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

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

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

0 голосов
/ 07 августа 2009

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

Мне удалось решить эту проблему с помощью AutoMapper (основанный на соглашении сопоставитель объектов и объектов.)

0 голосов
/ 06 августа 2009

Исходя из вашей ревизии, возможно, вам нужно это в коде, который заполняет ваш список выбора:

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"))%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...