Usuario
Edit action no hace nada en automapper

Pregunta
-
Estoy usando Visual Studio 2019, .net core 3.1 y automapper. Mi acción Editar no edita el registro. He visto tutoriales, pero todos son solo una acción y necesito hacer un crud. Tomando como ejemplo una acción de edición habitual, he hecho esto:
public class CustomerCountriesController : Controller { private readonly ApplicationDbContext _context; private readonly IMapper _mapper; public CustomerCountriesController(ApplicationDbContext context, IMapper mapper) { _context = context; _mapper = mapper; } // GET: CustomerCountries public async Task<IActionResult> Index() { //CustomerCountries customerCountry = new CustomerCountries(); var customerCountry = await _context.CustomerCountries.ToListAsync(); List<CustomerCountriesDto> countries = _mapper.Map<List<CustomerCountries>, List<CustomerCountriesDto>>(await _context.CustomerCountries.ToListAsync()); return View(countries); } public async Task<IActionResult> Edit(string id) { if (id == null) { return NotFound(); } var customerCountries = await _context.CustomerCountries.FindAsync(id); var model = _mapper.Map<CustomerCountries, CustomerCountriesDto>(customerCountries); if (customerCountries == null) { return NotFound(); } return View(model); //return View(customerCountries); } // POST: CustomerCountries/Edit/5 // To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] //public async Task<IActionResult> Edit(string id, [Bind("CustomerCountry")] CustomerCountries customerCountries) public async Task<IActionResult> Edit(string customerCountry, CustomerCountriesDto customerCountriesDto) { if (customerCountry != customerCountriesDto.CustomerCountry) { return NotFound(); } if (ModelState.IsValid) { try { var CustomerCountries = _mapper.Map<CustomerCountriesDto, CustomerCountries>(customerCountriesDto); _context.Update(CustomerCountries); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!CustomerCountriesExists(customerCountriesDto.CustomerCountry)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(customerCountriesDto); } public class AutoMapping : Profile { public AutoMapping() { CreateMap<CustomerCountries, CustomerCountriesDto>(); CreateMap<CustomerCountriesDto, CustomerCountries>(); } } public class CustomerCountries { [StringLength(50, ErrorMessage = "Longitud máxima para el país: 50")] public string CustomerCountry { get; set; } public ICollection<CustomerRegions> CustomerRegions { get; set; } } public class CustomerCountriesDto { public string CustomerCountry { get; set; } }
startup
services.AddAutoMapper(typeof(Startup));
El ID de la tabla es CustomerCountry
¿Me pueden decir la forma correcta? Ya he leido varios posts y no logro ensamblarlo correctamenteEsta es la vista
@model ManufacturaMVC.ViewModels.CustomerCountriesDto @{ ViewData["Title"] = "Edit"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h1>Edit</h1> <h4>CustomerCountries</h4> <hr /> <div class="row"> <div class="col-md-4"> <form asp-controller="CustomerCountries" asp-action="Edit" method="post"> <!--<form method="post" action="/CustomerCountries/Edit">--> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="CustomerCountry" class="col-lg-3 col-sm-3 control-label">Customer Country</label> <div class="col-lg-6"> <input asp-for="CustomerCountry" class="form-control" /> </div> </div> <!--<input type="hidden" asp-for="CustomerCountry" /> --> <div class="form-group"> <input type="submit" value="Save" class="btn btn-primary" /> </div> </form> </div> </div> <div> <a asp-action="Index">Back to List</a> </div> @section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }
- Editado Jhon2905 martes, 14 de julio de 2020 20:13
Todas las respuestas
-
Hola Jhon2905,
podrías revisar esto, me parece que te podría ser de ayuda.
Saludos cordiales
Gabriel Castro
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
- Editado Gabriel Castro R martes, 14 de julio de 2020 17:59
- Propuesto como respuesta Gabriel Castro R martes, 14 de julio de 2020 17:59
-
-
Así, llega nulo
var CustomerCountries = _mapper.Map<CustomerCountriesDto, CustomerCountries>(customerCountriesDto);
var country = _context.CustomerCountries.Find(CustomerCountries.CustomerCountry);
_context.Update(country);
await _context.SaveChangesAsync();
Él busca el modificado... no el que estaba primero... es lógico q no lo encuentre
- Editado Jhon2905 martes, 14 de julio de 2020 20:17
-
Aquí, no hace nada en ninguna de las dos formas
//No hace nada var country = new CustomerCountries { CustomerCountry = customerCountriesDto.CustomerCountry }; _context.Update(country); await _context.SaveChangesAsync();
//No hace nada var country = new CustomerCountries { CustomerCountry = CustomerCountry }; _context.Update(country); await _context.SaveChangesAsync();
También agregué esto y tampoco hace nada
var config = new MapperConfiguration(cfg => { cfg.CreateMap<CustomerCountriesDto, CustomerCountries>() .ReverseMap() .ForMember(CustomerCountriesDto => CustomerCountriesDto.CustomerCountry, expression => expression.MapFrom(model => model.CustomerCountry)); });
- Editado Jhon2905 martes, 14 de julio de 2020 21:01
-
He encontrado la solución gracias a un desarrollador experimentado que me guió a través del problema y corrigió mi código de vez en cuando (eso es realmente ayudar). Resulta que estaba usando un campo como PK: CustomerCountry ... No estaba usando e Id, cuando cambié el modelo, ocurrió la actualización
var CustomerCountries = _mapper.Map<CustomerCountriesDto, CustomerCountries>(customerCountriesDto); var country = _context.CustomerCountries.FirstOrDefault(c => c.Id == CustomerCountries.Id); country.CustomerCountry = customerCountriesDto.CustomerCountry; _context.Update(country); await _context.SaveChangesAsync();
- Editado Jhon2905 miércoles, 15 de julio de 2020 21:25
-
He encontrado la solución gracias a un desarrollador experimentado que me guió a través del problema y corrigió mi código de vez en cuando (eso es realmente ayudar). Resulta que estaba usando un campo como PK: CustomerCountry ... No estaba usando e Id, cuando cambié el modelo, ocurrió la actualización
var CustomerCountries = _mapper.Map<CustomerCountriesDto, CustomerCountries>(customerCountriesDto); var country = _context.CustomerCountries.FirstOrDefault(c => c.Id == CustomerCountries.Id); country.CustomerCountry = customerCountriesDto.CustomerCountry; _context.Update(country); await _context.SaveChangesAsync();
- Propuesto como respuesta Gabriel Castro R jueves, 16 de julio de 2020 20:58
-