none
Ajuda com Action Edit e Delete retornando nulo RRS feed

  • Pergunta

  • Amigos boa noite! 

    Estou desenvolvendo uma aplicação mas estou com um problema nas Actions Edit e Delete. Já olhei o código diversas vezes, mas ao chamar as actions citadas apresenta o seguinte erro: 

    The parameters dictionary contains a null entry for parameter ‘id’ of non-nullable type ‘System.Int32′ for method ‘System.Web.Mvc.ActionResult Edit(Int32)’ in ‘appXXX.Presentation.Controllers.XXXController’. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
    Nome do parâmetro: parameters

    O que estou observando é que, por algum motivo que ainda não consegui identificar, o parametro “id” nas actions citadas está retornando nulo. Alguém poderia me ajudar? Vou postar o código abaixo resumido e adaptado:

    Na Camada de DOMAIN:

    public interface IRepositoryBase where TEntity : class
    {
    IEnumerable GetAll();
    TEntity GetById(int id);
    …
    }
    
    public interface IServiceBase where TEntity : class
    {
    IEnumerable GetAll();
    TEntity GetById(int id);
    …
    }
    
    public class ServiceBase : IDisposable, IServiceBase where TEntity : class
    {
    private readonly IRepositoryBase _repository;
    
    public ServiceBase(IRepositoryBase repository)
    {
    _repository = repository;
    }
    
    public TEntity GetById(int id)
    {
    return _repository.GetById(id);
    }
    
    public IEnumerable GetAll()
    {
    return _repository.GetAll();
    }
    
    …
    }


    Na Camada de INFRA:

    public class RepositoryBase : IDisposable, IRepositoryBase where TEntity : class
    {
    protected AppContext context = new AppContext();
    
    public TEntity GetById(int id)
    {
    return context.Set().Find(id);
    }
    
    public IEnumerable GetAll()
    {
    return context.Set().ToList();
    }
    
    …
    }
    Na Camada de APPLICATION

    public interface IAppServiceBase where TEntity : class
    {
    IEnumerable GetAll();
    TEntity GetById(int id);
    …
    }
    
    public class AppServiceBase : IDisposable, IAppServiceBase where TEntity : class
    {
    private readonly IServiceBase _serviceBase;
    
    public AppServiceBase(IServiceBase serviceBase)
    {
    _serviceBase = serviceBase;
    }
    
    public TEntity GetById(int id)
    {
    return _serviceBase.GetById(id);
    }
    
    public IEnumerable GetAll()
    {
    return _serviceBase.GetAll();
    }
    …
    }


    Na Camada de APRESENTAÇÃO (CONTROLLER):

    private readonly IxxxAppService _xxxApp;
    
    public xxxController(IxxxAppService xxxApp)
    {
    _xxxApp = xxxApp;
    }
    
    // GET: xxx/Edit/5
    public ActionResult Edit(int id)
    {
    var xxxDomain = _xxxApp.GetById(id);
    var xxxViewModel = Mapper.Map(xxxDomain);
    
    return View(xxxViewModel);
    }
    
    //POST: xxx/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(xxxViewModel _xxx)
    {
    if (ModelState.IsValid)
    {
    var xxxDomain = Mapper.Map(_xxx);
    _xxxApp.Update(xxxDomain);
    
    return RedirectToAction(“Index”);
    }
    
    return View(_xxx);
    }
    Como podem ver o código é um repositório genérico. Já fiz de várias formas baseados em exemplos na internet e projetos que baixei, mas aí na execução, quando clica no no item (uma View do tipo List), a Action Edit não é chamada pq o id retorna nulo.

    A Action de Create funciona e a função GetAll() tbm. O problema mesmo é com o Edit e consequentemente com o Delete tbm. Não consigo perceber o que tem de errado.

    Obrigado pela atenção.
    terça-feira, 3 de maio de 2016 01:23

Respostas

  • UitanMaciel, o problema pode estar na sua camada de View, o Create e GetAll não dão o problema porque não é necessário passar nenhum parâmetro. Verifique como você está invocando estes métodos.

    Caso não identifique o problema, publique também o código da view que invoca os métodos Edit e Delete.

    Abs.

    • Marcado como Resposta UitanMaciel segunda-feira, 16 de maio de 2016 19:13
    sábado, 14 de maio de 2016 01:12
  • Exatamente, o problema estava em minha View. Coisa simples que não reparei. Não estava passando o id. Agora funcionou.

    <td>
    @Html.ActionLink("Editar", "Edit", new { id = item.BankId })
    <span>  |  </span>
    @Html.ActionLink("Excluir", "Delete", new { id = item.BankId })
    </td>

    • Marcado como Resposta UitanMaciel segunda-feira, 16 de maio de 2016 19:13
    segunda-feira, 16 de maio de 2016 19:12

Todas as Respostas

  • UitanMaciel, o problema pode estar na sua camada de View, o Create e GetAll não dão o problema porque não é necessário passar nenhum parâmetro. Verifique como você está invocando estes métodos.

    Caso não identifique o problema, publique também o código da view que invoca os métodos Edit e Delete.

    Abs.

    • Marcado como Resposta UitanMaciel segunda-feira, 16 de maio de 2016 19:13
    sábado, 14 de maio de 2016 01:12
  • Exatamente, o problema estava em minha View. Coisa simples que não reparei. Não estava passando o id. Agora funcionou.

    <td>
    @Html.ActionLink("Editar", "Edit", new { id = item.BankId })
    <span>  |  </span>
    @Html.ActionLink("Excluir", "Delete", new { id = item.BankId })
    </td>

    • Marcado como Resposta UitanMaciel segunda-feira, 16 de maio de 2016 19:13
    segunda-feira, 16 de maio de 2016 19:12