获取列表框的选定值
Get selected values of a ListBox
型号:
public virtual ICollection<Product> OriginalProducts { get; set; }
public virtual ICollection<Product> SimilarProducts { get; set; }
查看(创建和编辑等同):
<div id="divSimilar" class="form-group">
@Html.Label("Similar Products", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.ListBox("Products", null, htmlAttributes: new { @class = "form-control" })
</div>
</div>
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MyAttributes")] Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
List<string> selectedSimilars = Request.Form.GetValues("Products").ToList();
foreach (string Id in selectedSimilars)
{
Product similarProd = db.Products.Find(System.Convert.ToInt32(Id));
if (similarProd != null)
product.SimilarProducts.Add(similarProd);
}
db.SaveChanges();
return RedirectToAction("Index").Success("Successfully created");
}
ViewBag.Products = new SelectList(db.Products, "Id", "Name", product.SimilarProducts);
return View(product);
}
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
ViewBag.Products = new SelectList(db.Products.Where(p => p.Id != product.Id), "Id", "Name", product.SimilarProducts);
return View(product);
}
因此,由于 "Create" 部分工作正常,我想知道如何在我的 "Edit" 视图中获取所有选定的 SimilarProducts(我在 "Create" 中添加) .控制器需要进行哪些更改才能使其正常工作?
顺便说一句,因为我使用的是 ListBox,所以我认为 DropDownList 有不同的方式,因为我对所有 DropDownList 都使用这种方式并且工作正常。
编辑
我想在 "Edit" 视图中以蓝色显示所有产品(在我创建该产品时选择的产品)。换句话说,ActionResult "Edit" 应该从 SimilarProducts 列表中获取所有选定的产品,就像在 DropDownList 中一样。
ListBox
控件可以选择多个 Items
(因此,多个不同的值),如以下代码片段所示(回复:https://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selecteditems%28v=vs.110%29.aspx)
private void SelectedItems(object sender, RoutedEventArgs e)
{
if (lb.SelectedItem != null)
{
label1.Content = "Has " + (lb.SelectedItems.Count.ToString()) + " item(s) selected.";
}
}
您应该指定在选择中查找项目的业务逻辑(例如,在选择中的第一个)。但是,如果选择模式设置为 Single
,您可以使用 属性 SelectedItem
.
希望这可能有所帮助。
终于成功了,我会post解决方案,以防以后有人需要:
ViewBag.Products = new MultiSelectList(db.Products.Where(p => p.Id != product.Id), "Id", "Name", product.SimilarProducts.Select(p => p.Id));
小说明:
由于我用的是ListBox,所以必须用MultiSelectList,因为SelectList只识别一个被选中的项,它的参数是:(object selectedValue),MultiSelectList上已经是:(IEnumerable selectedValues),所以我改了SelectList
到 MultiSelectList
并将其添加: .Select(p => p.Id))
到我的 ActionResult "Edit".
型号:
public virtual ICollection<Product> OriginalProducts { get; set; }
public virtual ICollection<Product> SimilarProducts { get; set; }
查看(创建和编辑等同):
<div id="divSimilar" class="form-group">
@Html.Label("Similar Products", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.ListBox("Products", null, htmlAttributes: new { @class = "form-control" })
</div>
</div>
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MyAttributes")] Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
List<string> selectedSimilars = Request.Form.GetValues("Products").ToList();
foreach (string Id in selectedSimilars)
{
Product similarProd = db.Products.Find(System.Convert.ToInt32(Id));
if (similarProd != null)
product.SimilarProducts.Add(similarProd);
}
db.SaveChanges();
return RedirectToAction("Index").Success("Successfully created");
}
ViewBag.Products = new SelectList(db.Products, "Id", "Name", product.SimilarProducts);
return View(product);
}
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
ViewBag.Products = new SelectList(db.Products.Where(p => p.Id != product.Id), "Id", "Name", product.SimilarProducts);
return View(product);
}
因此,由于 "Create" 部分工作正常,我想知道如何在我的 "Edit" 视图中获取所有选定的 SimilarProducts(我在 "Create" 中添加) .控制器需要进行哪些更改才能使其正常工作?
顺便说一句,因为我使用的是 ListBox,所以我认为 DropDownList 有不同的方式,因为我对所有 DropDownList 都使用这种方式并且工作正常。
编辑
我想在 "Edit" 视图中以蓝色显示所有产品(在我创建该产品时选择的产品)。换句话说,ActionResult "Edit" 应该从 SimilarProducts 列表中获取所有选定的产品,就像在 DropDownList 中一样。
ListBox
控件可以选择多个 Items
(因此,多个不同的值),如以下代码片段所示(回复:https://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selecteditems%28v=vs.110%29.aspx)
private void SelectedItems(object sender, RoutedEventArgs e)
{
if (lb.SelectedItem != null)
{
label1.Content = "Has " + (lb.SelectedItems.Count.ToString()) + " item(s) selected.";
}
}
您应该指定在选择中查找项目的业务逻辑(例如,在选择中的第一个)。但是,如果选择模式设置为 Single
,您可以使用 属性 SelectedItem
.
希望这可能有所帮助。
终于成功了,我会post解决方案,以防以后有人需要:
ViewBag.Products = new MultiSelectList(db.Products.Where(p => p.Id != product.Id), "Id", "Name", product.SimilarProducts.Select(p => p.Id));
小说明:
由于我用的是ListBox,所以必须用MultiSelectList,因为SelectList只识别一个被选中的项,它的参数是:(object selectedValue),MultiSelectList上已经是:(IEnumerable selectedValues),所以我改了SelectList
到 MultiSelectList
并将其添加: .Select(p => p.Id))
到我的 ActionResult "Edit".