2014-01-08 3 views
2

У меня есть модель Product и хотите добавить соответствующие налоги на продукт с модели Tax. Один продукт может иметь несколько налогов, поэтому я создал еще одну модель TaxApplied для хранения отношений.MVC 4 привязка к списку для детского стола

Я добавил ListBox с MultiSelectList в представление Создать для Product, который показывает доступные налоги.

@Html.ListBox("AppliedTaxes", ViewBag.AppliedTaxes as MultiSelectList) 

Но я получаю следующее сообщение об ошибке при попытке создать продукт с выбранными налогами. Как мне изменить вид, модель или контроллер, например, добавить налоговые отношения?

The ViewData item that has the key 'AppliedTaxes' is of type 'System.Collections.Generic.List`1[[StoreManager.Models.TaxApplied, StoreManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' but must be of type 'IEnumerable<SelectListItem>'. 

Модели Описанная ниже

public class Product 
    { 
     public int ID { get; set; } 
     public string Name { get; set; 
     public float SalePrice { get; set; } 
     public List<TaxApplied> AppliedTaxes { get; set; } 

    }   

public class Tax 
    { 
     public int ID { get; set; } 
     [DisplayName("Tax Code")] 
     public string TaxCode { get; set; } 
     [DisplayName("Tax Percent")] 
     public string Value { get; set; } 
    } 

    public class TaxApplied 
    { 
     public int ID { get; set; } 
     [ForeignKey("Product")] 
     public int ProductID { get; set; } 
     [ForeignKey("Tax")] 
     public int TaxID { get; set; } 

     public virtual Product Product { get; set; } 
     public virtual Tax Tax { get; set; } 
    } 

действия контроллера для Product создать

// 
// GET: /Product/Create 

public ActionResult Create() 
{ 
    ViewBag.NavProduct = "active"; 

    MultiSelectList taxes = new MultiSelectList(db.Taxes.ToList<Tax>(), "ID", "Name"); 
    ViewBag.AppliedTaxes = taxes; 

    return View(); 
} 

// 
// POST: /Product/Create 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Product product) 
{ 
    ViewBag.NavProduct = "active"; 
    if (ModelState.IsValid) 
    { 
     db.Products.Add(product); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

     return View(product); 
} 
+0

Посмотрите на типы переменных для Html.ListBox. Он ожидает List , и вы, кажется, передаете его List . Попробуйте Html.ListBox («AppliedTaxes, новый SelectList ((IList ) ViewBag.Taxes, ...)) – David

+0

Я изменил контроллер для представления. Форма отображается просто отлично. Это форма submit, которая дает мне ошибка MultiSelectList tax = new MultiSelectList (db.Taxes.ToList (), «ID», «Name»); ViewBag.AppliedTaxes = налоги; –

ответ

1

Вы должны вернуть MultiSelectList из вашего общего списка.

Вот пример того, как сделать это:

var appliedTaxes = new List<TaxApplied>(); 
appliedTaxes.Add(new TaxApplied { ID = 1, ProductID = 1 }); 
var items = appliedTaxes.Select(t => new SelectListItem { Text = t.ID.ToString(), Value = t.ProductID.ToString() }).ToList(); 
ViewBag.AppliedTaxes = new MultiSelectList(items, "Text", "Value"); 

Пожалуйста, обратите внимание, я только с помощью идентификаторов как текст и значение для демонстрационных целей.

Update

Измените свой пост к этому:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Product product) 
{ 
    ViewBag.NavProduct = "active"; 
    if (ModelState.IsValid) 
    { 
     db.Products.Add(product); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    MultiSelectList taxes = new MultiSelectList(db.Taxes.ToList<Tax>(), "ID", "Name"); 
    ViewBag.AppliedTaxes = taxes; 

    return View() 
} 
+0

Представления прекрасны. У меня есть точное действие контроллера. Его форму отправляет, что дает мне ошибку –

+0

Извините, вам также нужно вернуть тот же код из вашего почтового метода. Я добавлю ваш метод действия post controller к ответу, чтобы его обновить, на всякий случай, когда люди неправильно понимают, как я. – hutchonoid

+0

Отредактированный вопрос :) –

Смежные вопросы