Как я могу заставить свой 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);

    }

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

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

    }

}

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

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

    }

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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