我创建了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);
}
答案 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()
}