Получить выбранные значения ListBox

Модель:

public virtual ICollection<Product> OriginalProducts { get; set; }
public virtual ICollection<Product> SimilarProducts { get; set; }

Вид (Create и Edit равны):

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

Итак, так как часть "Создать" работает нормально, я хочу знать, как я могу сделать так, чтобы все выбранные Похожие продукты (которые я добавил в "Создать") в моем представлении "Редактировать". Какие изменения необходимы в контроллере, чтобы он работал?

Кстати, так как я использую ListBox, я думаю, что существует другой способ DropDownList, потому что я использовал этот способ для всех моих DropDownList и работает нормально.

РЕДАКТИРОВАТЬ

Я хочу отобразить в представлении "Изменить" все продукты (которые были выбраны при создании этого продукта) синим цветом. Другими словами, ActionResult "Edit" должен получить все выбранные продукты из списка SimilarProducts, как в DropDownList.

2 ответа

Решение

Наконец-то мне удалось заставить его работать, я опубликую решение на случай, если кому-то понадобится в будущем:

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 "Изменить".

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,

Надеюсь, что это может помочь.

Другие вопросы по тегам