¿Cómo puedo hacer que mi MultiSelectList se enlace a mi modelo de datos?

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

Pregunta

Tengo una relación de muchos a muchos entre los coches y muchas otras mesas. Desde mi punto de vista, quiero poder tener una lista de selección múltiple para elementos como luces. He intentado muchos formatos diferentes, parece que no puedo obtener la lista para establecer elementos seleccionados. Mi forma preferida de hacerlo es @ Html.ListBoxFor (model => model.enitity.relatedentity, Model.SomeSelectListItemList), pero Parece que no se puede obtener la lista para configurar los elementos seleccionados en la vista.

A continuación se muestra mi código con el que estaba probando. Utilizo Asp.net MVC5, C # y entidad framework 6.

Esta es mi acción del controlador.

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

    }

Aquí está mi punto de vista

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

    }

}

Este es mi modelo de vista

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

    }

}

Respuesta popular

El mayor problema con la publicación de valores para una relación de muchos a muchos es que no hay un campo directo al que enlazar en su modelo. Aquí es donde los modelos de vista se vuelven muy prácticos, que ya estás usando, pero no de la forma correcta para esto.

Primero necesita su SelectList , que en realidad puede ser solo un IEnumerable<SelectListItem> . Esto contendrá todas las opciones disponibles, que es bastante fácil. Así que en su modelo de vista:

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

Y en tu acción:

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

Observe que no estoy configurando Selected : dejaremos que HtmlHelper maneje eso. Tampoco estoy tratando con un MultiSelectList todavía.

Ahora, también necesitará algo para volver a publicar, ya que sus valores serán ids, usaremos una List<int> , por lo que en su modelo de vista:

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

Hay un poco de aquí. El método de set de la propiedad es simple: cuando recibimos un valor publicado, solo configuramos categorías selectedCategories para eso. La get es un poco más complicada: aquí necesitamos condensar tu lista de objetos de categoría (denominados Categories aquí porque no sé de dónde viene realmente) en una simple lista de ID para esas categorías.

Ahora, en su opinión:

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

Eso es todo lo que necesitas. Está utilizando un control ListBox , por lo que ya es una lista de selección múltiple. Y, al vincularlo a la lista de todos los identificadores seleccionados actualmente, sabe qué elementos seleccionar automáticamente en la lista de SelectListItem que obtiene de Model.CategoryChoices .

En su acción posterior, debe traducir estos identificadores en sus objetos asociados:

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

Luego, puede configurar las categorías de su modelo a esta nueva lista manualmente:

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué