En este capitulo, continuaremos discutiendo los ayudantes de etiquetas. Tambien agregaremos una nueva funcion en nuestra aplicacion y le daremos la capacidad de editar los detalles de un empleado existente. Comenzaremos agregando un enlace al lado de cada empleado que ira a una accion Editar en el HomeController.
Aun no tenemos la accion Editar, pero necesitaremos un ID de empleado que podamos editar.cree una nueva vista haciendo clic con el boton derecho en la carpeta Vistas → Inicio y seleccionando Agregar → Nuevos elementos .
En el panel central, seleccione la vista de pagina MVC; llame a la pagina Edit.cshtml. Ahora haga clic en el Boton Agregar.
@model Employee @ {ViewBag. Titulo = $ "Editar {Model.Name}}
Para el titulo de esta pagina podemos decir que queremos editar y luego proporcionar el nombre del empleado.
-
El signo de dolar delante de Editar permitira que el tiempo de ejecucion reemplace Model.Name con un valor que este en esta propiedad como el nombre del empleado.
-
Dentro de la etiqueta del formulariopodemos usar ayudantes de etiquetas como asp-action y asp-contr oller. para que cuando el usuario envie este formulario, vaya directamente a una accion especifica del controlador.
-
En este caso, queremos ir a la accion Editar en el mismo controlador y queremos decir explicitamente que para el metodo en este formulario debe usar un HttpPost .
-
El metodo predeterminado para un formulario es GET, y no queremos editar a un empleado mediante una operacion GET.
-
En la etiqueta de etiqueta, hemos utilizado el asistente de etiquetas asp-for que indica que se trata de una etiqueta para la propiedad Name del modelo. Este asistente de etiquetas puede configurar el atributo Html.For para que tenga el valor correcto y establecer el texto interno de esta etiqueta para mostrar realmente lo que queremos, como el nombre de la etiqueta. empleado.
Vayamos a la class HomeController yagreguemos la accion Editar que devuelve la vista que le da al usuario un formulario para editar un empleado, luego necesitaremos una segunda accion Editar que respondera a un HttpPost como se muestra a continuacion abajo.
[HttpGet] Public IActionResult Edit (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); if (modelo == null) {return RedirectToAction ( "Index "); } return View (modelo); }
Primero, necesitamos una accion de edicion que responda a una solicitud GET. Necesitara una identificacion de empleado. El codigo aqui sera similar al codigo que tenemos en la accion Detalles. Primero extraeremos los data del empleado que el usuario quiere modificar. Tambien debemos asegurarnos de que el empleado realmente exista. Si no existe, redirigiremos al usuario a la vista de indice. Pero cuando un empleado thxist, renderizaremos la vista Editar.
Tambien debemos responder al HttpPost que enviara el formulario.
Agreguemos una nueva class en HomeController .cs como se muestra en el siguiente programa.
public class EmployeeEditViewModel {[Required, MaxLength (80)] public string Name {get; juntos; }}
En la accion de edicion que respondera al HttpPost se tomara un EmployeeEditViewModel, pero no un empleado en si, ya que solo queremos capturar los elementos que tienen forma en el archivo de edicion. cshtml.
La siguiente es la implementacion de la accion Editar.
[HttpPost] public IActionResult Edit (int id, entrada EmployeeEditViewModel) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); empleado var = sqlData.Get (id); if (employee! = null && ModelState.IsValid) {employee.Name = input.Name; context.SaveChanges return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View (empleado); }
El formulario de edicion siempre debe enviarse desde una URL que tenga una identificacion en la URL de acuerdo con nuestras reglas de enrutamiento, algo asi como / home / edit / 1 .
-
El formulario siempre sera devuelto a esta misma URL, /home/edit/1.
El marco MVC puede extraer este ID de la URL y pasarlo como parametro.
-
Siempre debemos verificar si ModelState es valido y tambien asegurarnos de que este empleado este en la base de data y que no sea nulo antes de realizar una operacion de actualizacion en la base de data.
-
Si nada de esto es cierto, devolveremos una vista y permitiremos que el usuario vuelva a intentarlo. Aunque en una aplicacion real con usuarios concurrentes, si el empleado es nulo, puede ser porque faltan los data del empleado.ha sido eliminado por alguien.
-
Si este empleado no existe, digale al usuario que el empleado no existe.
-
De lo contrario, marque ModelState. Si ModelState no es valido, devuelve una vista. Esto corrige el cambio y hace que ModelState sea valido.
-
Copie el nombre de la plantilla de la vista de entrada al empleado extraido de la base de data y guarde los cambios. El metodo SaveChagnes () volcara todas estas modificaciones en la base de data.
La siguiente es la implementacion completa de HomeController.
usando Microsoft.AspNet.Mvc; utilizando FirstAppDemo.ViewModels; utilizando FirstAppDemo.Services; utilizando FirstAppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; utilizando System.ComponentModel.DataAnnotations; espacio de nombres FirstAppDemo.Controllers {class publica HomeController: Controller {public ViewResult Index () {var model = new HomePageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); } Detalles publicos IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var model = sqlData.Get (id) if (model == null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpGet] edicion publica de IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); if (modelo == null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpPost] Public IActionResult Edit (int id, entrada EmployeeEditViewModel) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); empleado var = sqlData.Get (id); si (empleado! = nulo && ModelState.IsValid) {employee.Name = input.Name; context.SaveChanges return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View (empleado); }} class publica SQLEmployeeData {FirstAppDemoDbContext privado _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _context.Employees.ToList }} Public class HomePageViewModel {publico IEnumerable Empleados {get; juntos; }} public class EmployeeEditViewModel {[Requerido, MaxLength (80)] cadena publica Name {get; juntos; }}}
Compilemos el programa y ejecutemos la aplicacion.
Ahora tenemos un enlace de edicion disponible;Editemos los detalles de Josh haciendo clic en el enlace Editar.
Cambiemos el nombre a Josh Groban.
Haga clic en el boton Guardar.
Puede ver que el nombre se ha cambiado a Josh Groban como se muestra arriba en la captura d 'pantalla Ahora hagamos clic en el enlace de Inicio.
En la pagina de inicio, ahora vera el nombre actualizado.