none
Edit action no hace nada en automapper RRS feed

  • 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 correctamente

    Esta 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
    martes, 14 de julio de 2020 7:52

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.  

    martes, 14 de julio de 2020 12:57
  • Hola, sí... tengo eso:

    public AutoMapping()
            {
                CreateMap<CustomerCountries, CustomerCountriesDto>();
                CreateMap<CustomerCountriesDto, CustomerCountries>();
            }

    martes, 14 de julio de 2020 19:43
  • 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
    martes, 14 de julio de 2020 19:53
  • 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
    martes, 14 de julio de 2020 20:52
  • 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
    miércoles, 15 de julio de 2020 21:24
  • 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();  
    miércoles, 15 de julio de 2020 21:24
  • Hola Jhon2905,

    Me alegro de escuchar que encontraste una solución a tu problema, por favor marca la respuesta para que otras personas puedan saber como solucionar este error.

    Saludos cordiales

    Gabriel Castro

    jueves, 16 de julio de 2020 20:57