MVC 4绑定到子表的List

时间:2014-01-08 12:03:38

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我创建了Product模型,并希望从Tax模型中为产品添加相关税费。单个产品可以应用多个税,因此我创建了另一个模型TaxApplied来存储关系。

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

1 个答案:

答案 0 :(得分: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");

请注意,我仅将ID作为文字和值用于演示目的。

<强>更新

将您的帖子更改为:

[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()
}