c# asp.net-mvc asp.net-core tag-helpers

c# - ¿Cómo saber las casillas de verificación seleccionadas desde el método de acción Crear HttpPost?



asp.net-mvc asp.net-core (1)

Tengo una relación de muchos a muchos entre el Student y el Course . El conjunto de entidades de enlace es Enrollment . En aras de la simplicidad, todos se definen de la siguiente manera.

Modelos

public class Course { public int Id { get; set; } public string Title { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } public class Enrollment { public int Id { get; set; } public int StudentId { get; set; } public int CourseId { get; set; } public virtual Student Student { get; set; } public virtual Course Course { get; set; } } public class Student { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }

ViewModels

public class StudentCourseVM { public Student Student { get; set; } public IEnumerable<Course> SelectedCourses { get; set; } public IEnumerable<Course> AvailableCourses { get; set; } }

Controladores

public IActionResult Create() { var availableCourses = context.Courses; return View(new StudentCourseVM { AvailableCourses = availableCourses }); } [HttpPost] public async Task<IActionResult> Create(StudentCourseVM sc) { if (ModelState.IsValid) { // What should I do here? // ====================== await context.SaveChangesAsync(); return RedirectToAction("Index"); } return View(sc); }

Puntos de vista

@model MasterDetails.ViewModels.StudentCourseVM <form asp-action="Create"> <div> <label asp-for="@Model.Student.Name"></label> <input asp-for="@Model.Student.Name" /> </div> <div> <label asp-for="@Model.Student.Enrollments"></label><br /> @foreach (var course in Model.AvailableCourses) { <input type="checkbox" name="@course.Title" id="@course.Id" /> @course.Title <br /> } </div> <input type="submit" value="Create" /> </form>

Preguntas

¿Cómo saber las casillas de verificación seleccionadas desde el método de acción Create HttpPost?


Puede usar plantillas de editor para hacer esto.

Primero, cree una nueva clase para la selección del curso y actualice su modelo de vista para tener una colección de esa clase.

public class SelectedCourse { public int Id { get; set; } public string Name { get; set; } public bool IsSelected { get; set; } } public class StudentCourseVM { public int StudentId { set; get; } public IEnumerable<SelectedCourse> SelectedCourses { get; set; } }

No necesita copiar y pegar todas las propiedades de su modelo de entidad a su modelo de vista. El modelo de vista solo necesita aquellas propiedades que la vista necesita absolutamente . Supongo que desea asignar cursos a un estudiante específico

Ahora vaya a su ~/Views/YourControllerName y cree un directorio llamado EditorTemplates. Cree un nuevo archivo de afeitar allí y asigne el nombre SelectedCource.cshtml

Pegue este código en el nuevo archivo

@model SelectedCourse <label>@Model.Name</label> <input asp-for="IsSelected"/> <input type="hidden" asp-for="Id" />

Ahora en su acción GET, cree un objeto del modelo de vista, cargue la colección SelectedCourses y envíela a la vista.

public IActionResult Create() { // I hard coded the student id and the courses here. // you may replace it with real data. var vm = new StudentCourseVM { StudentId = 12 }; //Assuming we are assigning courses to the student with id 12 vm.SelectedCourses = new List<SelectedCourse>() { new SelectedCourse {Id = 1, Name = "CSS"}, new SelectedCourse {Id = 2, Name = "Swift"}, new SelectedCourse {Id = 3, Name = "IOS"}, new SelectedCourse {Id = 4, Name = "Java"} }; return View(vm); }

Ahora en su vista principal ( Create.cshtml ) que está fuertemente EditorFor , use el método de ayuda EditorFor en la propiedad SelectedCourses .

@model StudentCourseVM <form asp-action="Create"> @Html.EditorFor(f=>f.SelectedCourses) <input type="hidden" asp-for="StudentId"/> <input type="submit"/> </form>

La plantilla del Editor ejecutará el código en el archivo de la plantilla del editor para cada elemento de la colección SelectedCourses. Entonces tendrá el nombre del curso y una casilla de verificación visible para el usuario.

En su método de acción HttpPost, puede usar el mismo modelo de vista que el parámetro. Cuando se envía el formulario, puede recorrer los elementos en la propiedad SelectedCourses y verificar el valor de la propiedad IsSelected . El usuario de los cursos seleccionados en la interfaz de usuario tendrá un true valor.

[HttpPost] public IActionResult Create(StudentCourseVM model) { var studentId = model.StudentId; foreach (var modelSelectedCourse in model.SelectedCourses) { if (modelSelectedCourse.IsSelected) { //this one is selected. Save to db } } // to do : Return something }

Seleccionar previamente algunas casillas de verificación en la carga de la página

A veces, desea seleccionar previamente algunas casillas de verificación cuando se carga la página (Ej .: Para su pantalla de edición, desea mostrar los cursos ya guardados como marcados). Para hacer esto, simplemente necesita establecer la propiedad IsSelected del objeto SelectedCourse correspondiente en verdadero en su método de acción GET.

public IActionResult Edit(int id) { // I hard coded the student id and the courses here. // you may replace it with real data. var vm = new StudentCourseVM { StudentId = id }; //Assuming we are assigning courses to the student with id 12 vm.SelectedCourses = new List<SelectedCourse>() { new SelectedCourse {Id = 1, Name = "CSS"}, new SelectedCourse {Id = 2, Name = "Swift", IsSelected = true }, new SelectedCourse {Id = 3, Name = "IOS", IsSelected = true }, new SelectedCourse {Id = 4, Name = "Java"} }; return View(vm); }

El código anterior seleccionará previamente las casillas de verificación para Swift e IOS .