获取ListBox的选定值

时间:2015-06-07 16:41:02

标签: c# listbox entity-framework-6.1 asp.net-mvc-5.2

型号:

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

所以,因为&#34;创造&#34;部分工作正常,我想知道如何在我的&#34;编辑&#34;中获取所有选定的SimilarProducts(我在&#34;创建&#34;中添加);视图。控制器需要进行哪些更改才能使其正常工作?

顺便说一句,因为我使用了ListBox,我认为DropDownList的方式不同,因为我对所有的DropDownLists使用了这种方式并且工作正常。

修改

我想在&#34;编辑&#34;查看,所有产品(在我创建该产品时选择)为蓝色。换句话说,ActionResult&#34;编辑&#34;应该从SimilarProducts列表中获取所有选定的产品,如DropDownList。

2 个答案:

答案 0 :(得分:0)

ListBox控件可能有多个选定的Items(因此,多个不同的值),如以下代码段所示(re: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

希望这可能会有所帮助。

答案 1 :(得分:0)

最后,我设法让它发挥作用,我将发布解决方案,以防将来有人需要:

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),所以我改变了{{1} } SelectList并将其添加到我的ActionResult“编辑”中MultiSelectList