Как я могу заставить свой MultiSelectList привязываться к моей модели данных?

asp.net-mvc asp.net-mvc-5 c# entity-framework entity-framework-6

Вопрос

У меня много отношений между машинами и многими другими столами. На мой взгляд, я хочу иметь список мультиселектов для таких элементов, как огни. Я пробовал много разных форматов, я не могу заставить список установить выбранные элементы. Мой предпочтительный способ сделать это будет @ Html.ListBoxFor (model => model.enitity.relatedentity, Model.SomeSelectListItemList), но я похоже, не может получить список для установки выбранных элементов в представлении.

Ниже мой код, который я тестировал, использую Asp.net MVC5, C # и сущность framework 6.

Это мое действие контроллера

    // GET: Car/Edit/
    [Authorize(Roles = "Ecar")]
    public ActionResult Edit(int id)
    {


        CarsEditViewModel carEditViewModel = new CarsEditViewModel();

        carEditViewModel.Cars = unitOfWorkcar.CarRepository.FindIncluding(id);

        IList<Approval> approvalList = unitOfWorkcar.ApprovalRepository.All.ToList();
        IList<Connector> connectorList = unitOfWorkcar.ConnectorRepository.All.ToList();
        IList<InputVoltage> inputVoltagesList = unitOfWorkcar.InputVoltageRepository.All.ToList();



        carEditViewModel.ApprovalList = from c in approvalList select new SelectListItem { Text = c.Name, Value = c.Id.ToString(), Selected = true};

        carEditViewModel.Categories = new MultiSelectList(carEditViewModel.ApprovalList, "Value", "Text", "Selected");


       // ,carEditViewModel.ApprovalList.Select(c => c.Text),carEditViewModel.ApprovalList.Select(c => c.Selected)

        //carEditViewModel.ApprovalList = from c in approvalList select new MultiSelectList( //{ Selected = (carEditViewModel.Cars.Approvals.Any(app => app.Id == c.Id)) , Text = c.Name, Value = c.Id.ToString() };
       // carEditViewModel.ConnectorList = from c in connectorList select new SelectListItem { Selected = true,  Text = c.Name, Value = c.Id.ToString() };
        carEditViewModel.InputVoltageList = from c in inputVoltagesList select new SelectListItem { Text = c.Name, Value = c.Id.ToString() };



        return View(carEditViewModel);

    }

Вот мой взгляд

@model NewBobPortal.ViewModels.CarsEditViewModel

 @using (Html.BeginForm())
{



   @* @Html.ListBoxFor("SelectedApprovals",model => model., new { @class = "multiselect" })*@
    @*@Html.ListBoxFor(model => model.Cars.Approvals, Model.ApprovalList)
    @Html.ListBoxFor(model => model.Cars.Connectors,Model.ConnectorList, new {Multiple = "multiple"})
    @Html.ListBoxFor(model => model.ConnectorList, Model.ConnectorList)*@
    @*@Html.ListBox("test",Model.Cars.InputVoltages, Model.InputVoltageList)*@
    @Html.DropDownList("somethingelse", new MultiSelectList(Model.InputVoltageList, "Value", "Text", Model.InputVoltageList.Select(c => c.Value)), new { multiple = "multiple" })
    @Html.DropDownListFor(model => model.Cars.InputVoltages , new MultiSelectList(Model.LensColorList, "Value", "Text", Model.LensColorList.Select(c => c.Value)), new { multiple = "multiple" })


    @Html.ListBoxFor(m => m.Cars.Approvals, Model.Categories)



    <p>
        <input type="submit" value="Save" />
    </p>

}

Это моя модель взгляда

using NewBobPortal.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

 namespace NewBobPortal.ViewModels
 {
public class CarsEditViewModel
{
    public Car Cars { get; set; }
    public IEnumerable<SelectListItem> ApprovalList { get; set; }
    public IEnumerable<MultiSelectList> ConnectorList { get; set; }
    public IEnumerable<SelectListItem> InputVoltageList { get; set; }




    public MultiSelectList Categories { get; set; }
    public IEnumerable<Approval> SelectedCategories { get; set; }

}

}

Популярные ответы

Самая большая проблема с отправкой значений для отношения «многие ко многим» заключается в том, что нет прямого поля для привязки к вашей модели. Здесь модели просмотра становятся очень удобными, которые вы уже используете, но не совсем правильно для этого.

Сначала вам понадобится ваш SelectList , который может фактически быть IEnumerable<SelectListItem> . Это будет содержать все доступные опции, что достаточно просто. Итак, в вашей модели зрения:

public IEnumerable<SelectListItem> CategoryChoices { get; set; }

И в ваших действиях:

carEditViewModel.CategoryChoices = approvalList.Select(m => new SelectListItem {
    Text = c.Name,
    Value = c.Id.ToString()
});

Обратите внимание, что я не задал Selected : мы разрешим HtmlHelper обрабатывать это. Я также не MultiSelectList дело с MultiSelectList .

Теперь вам также потребуется что-то, чтобы отправить сообщение обратно, поскольку ваши значения будут идентификаторами, мы будем использовать List<int> , поэтому в вашей модели просмотра:

private List<int> selectedCategories;
public List<int> SelectedCategories
{
    get
    {
        if (selectCategories == null)
        {
            selectedCategories = Categories.Select(m => m.Id).ToList();
        }
        return selectedCategories;
    }
    set { selectedCategories = value; }
}

Здесь немного. Метод set свойства прост: когда мы возвращаем обратно значение, просто установите для него selectedCategories . get немного сложнее: здесь нам нужно сконденсировать список объектов категории (называемых Categories здесь, потому что я не знаю, откуда это происходит) в простой список идентификаторов для этих категорий.

Теперь, на ваш взгляд:

@Html.ListBoxFor(m => m.SelectedCategories, Model.CategoryChoices)

Это все, что вам нужно. Вы используете элемент управления ListBox так что это уже список с несколькими выборами. И, связывая его со списком всех выбранных в настоящее время идентификаторов, он знает, какие элементы выбрать автоматически в списке SelectListItem он получает из Model.CategoryChoices .

В вашем посту после этого вам необходимо перевести эти идентификаторы в связанные объекты:

 var newCategories = repository.Categories.Where(m => carEditViewModel.SelectedCategories.Contains(m.Id));

Затем вы можете вручную установить категории своей модели в этот новый список:

car.Categories = newCategories;



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему