繁体   English   中英

asp.net core 3 MVC上的模型绑定属性为空

[英]Model Binding properties null on asp.net core 3 MVC

谁能告诉我我做错了什么? 我正在尝试绑定空属性。

解释:

我的控制器索引看起来不错,所以在我的视图中我可以看到我想要绑定的所有输入值(IdPedidoAtendimento、PedidoAtendimentoTaxa、HorarioAgendado、IdPedidoTipoPagamento、IdUnidadeUsuario)。

到目前为止,一切看起来都很好。 但是,提交页面后,在我的Controller CheckOut中,绑定的 checkOut 对象中的所有属性都为 null,如图所示。

在此处输入图片说明

它工作正常,我不知道我做了什么,所以它现在得到空属性。 我正在使用 asp.net 核心 3.1 MVC

视图模型

public class CheckOut
{
    public Usuario Usuario { get; set; }
    public UsuarioUnidade UsuarioUnidade { get; set; }
    public CatalogoEndereco CatalogoEndereco { get; set; }
    public UsuarioPagamento UsuarioPagamento { get; set; }

    public byte IdPedidoAtendimento { get; set; }
    public string PedidoAtendimentoNome { get; set; }
    public decimal PedidoAtendimentoTaxa { get; set; }
    public DateTime? HorarioAgendado { get; set; }

    public byte IdPedidoTipoPagamento { get; set; }
    public string PedidoTipoPagamento { get; set; }

    public int IdUnidadeUsuario { get; set; }

    public string Nome { get; set; }

    public string NumEndereco { get; set; }
    public string ComplementoEndereco { get; set; }
    public string RuaNome { get; set; }
    public string CidadeNome { get; set; }
    public string EstadoNome { get; set; }
    public string CEP { get; set; }

    public byte? isCPF { get; set; }
    public string CPF { get; set; }

    public string NumeroCartao { get; set; }
    public string CodCartao { get; set; }
}

控制器

    public IActionResult Index()
    {
        var user = User.FindFirst(ClaimTypes.Name);
        if (user != null)
        {
            Usuario usuario = new Usuario();
            usuario = _context.Usuario
                .SingleOrDefault(u => u.Email.Equals(user.Value) && u.IsAtivo == true);

            CatalogoEndereco catalogoEndereco = new CatalogoEndereco();
            catalogoEndereco = _context.CatalogoEndereco
               .Where(c => c.IdUsuario.Equals(usuario.IdUsuario) && c.IsAtivo == true && c.IsPrincipal == true)
               .SingleOrDefault();

            UsuarioPagamento usuarioPagamento = new UsuarioPagamento();
            usuarioPagamento = _context.UsuarioPagamento
               .Where(c => c.IdUsuario.Equals(usuario.IdUsuario) && c.IsPrincipal == true)
               .SingleOrDefault();

            UsuarioUnidade usuarioUnidade = new UsuarioUnidade();
            usuarioUnidade = _context.UsuarioUnidade
               .Where(c => c.IdUsuario.Equals(usuario.IdUsuario) && c.IdUnidadeNavigation.IsAtiva == true && c.IsPrincipal == true)
               .SingleOrDefault();

            UsuarioAtendimento usuarioAtendimento = new UsuarioAtendimento();
            usuarioAtendimento = _context.UsuarioAtendimento
               .Where(c => c.IdUsuario.Equals(usuario.IdUsuario) && c.IsPrincipal == true)
               .SingleOrDefault();

            CheckOut checkOut = new CheckOut()
            {
                Usuario = usuario,
                UsuarioUnidade = usuarioUnidade,
                CatalogoEndereco = catalogoEndereco,
                UsuarioPagamento = usuarioPagamento,

                IdPedidoAtendimento = usuarioAtendimento.Tipo,
                PedidoAtendimentoNome = _context.PedidoAtendimento
                    .FirstOrDefault(t => t.IdPedidoAtendimento == usuarioAtendimento.Tipo).Nome,
                PedidoAtendimentoTaxa = _context.PedidoAtendimento
                    .FirstOrDefault(t => t.IdPedidoAtendimento == usuarioAtendimento.Tipo).Taxa

            };

            if (usuarioAtendimento.Tipo == 1)
            {
                checkOut.Nome = usuario.Nome; 

                if (usuarioUnidade != null)
                {
                    checkOut.IdUnidadeUsuario = usuarioUnidade.IdUnidade;
                }

                if (catalogoEndereco != null)
                {
                    checkOut.RuaNome = catalogoEndereco.IdEnderecoLogradouroNavigation.IdRuaNavigation.Nome;
                    checkOut.CidadeNome = catalogoEndereco.IdEnderecoLogradouroNavigation.IdCidadeNavigation.Nome;
                    checkOut.EstadoNome = catalogoEndereco.IdEnderecoLogradouroNavigation.IdEstadoNavigation.Nome;
                    checkOut.NumEndereco = catalogoEndereco.NumEndereco;
                    checkOut.ComplementoEndereco = catalogoEndereco.Complemento;
                    checkOut.CEP = catalogoEndereco.IdEnderecoLogradouroNavigation.Cep;
                }
            }
            else if (usuarioAtendimento.Tipo == 2)
            {
                if (usuarioUnidade != null)
                {
                    checkOut.IdUnidadeUsuario = usuarioUnidade.IdUnidade;
                    checkOut.Nome = usuarioUnidade.IdUnidadeNavigation.Nome; 

                    checkOut.RuaNome = usuarioUnidade.IdUnidadeNavigation.IdEnderecoLogradouroNavigation.IdRuaNavigation.Nome;
                    checkOut.CidadeNome = usuarioUnidade.IdUnidadeNavigation.IdEnderecoLogradouroNavigation.IdCidadeNavigation.Nome;
                    checkOut.EstadoNome = usuarioUnidade.IdUnidadeNavigation.IdEnderecoLogradouroNavigation.IdEstadoNavigation.Nome;
                    checkOut.NumEndereco = usuarioUnidade.IdUnidadeNavigation.NumEndereco;
                    checkOut.CEP = usuarioUnidade.IdUnidadeNavigation.IdEnderecoLogradouroNavigation.Cep;
                }
            }

            if (usuarioPagamento != null)
            {
                checkOut.IdPedidoTipoPagamento = usuarioPagamento.Tipo;
                checkOut.PedidoTipoPagamento = _context.PedidoTipoPagamento
                    .FirstOrDefault(t => t.IdPedidoTipoPagamento == usuarioPagamento.Tipo).Nome;

                checkOut.isCPF = 0;
                checkOut.CPF = usuario.Cpf;
                checkOut.NumeroCartao = null;
                checkOut.CodCartao = null;

                if (usuarioPagamento.Tipo == 1 || usuarioPagamento.Tipo == 2)
                {
                    checkOut.NumeroCartao = "**** " + usuarioPagamento.Numero.Substring(12, 4);
                    checkOut.CodCartao = null; 
                }
            }
            return View(checkOut);
        }
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> CheckOut([Bind("IdPedidoAtendimento,PedidoAtendimentoTaxa,HorarioAgendado,IdPedidoTipoPagamento,IdUnidadeUsuario")] CheckOut checkOut)
    {
        if (ModelState.IsValid)
        {
            var user = User.FindFirst(ClaimTypes.Name);
            if (user != null)
            {
                var cliente = _context.Usuario.SingleOrDefault(u => u.Email.Equals(user.Value));

                var pedido = new Pedido()
                {
                    IdUsuario = cliente.IdUsuario,
                    IdUnidade = checkOut.IdUnidadeUsuario,
                    IdPedidoCanalVenda = 1,
                    IdPedidoAtendimento = checkOut.IdPedidoAtendimento, 
                    IdAtendente = null,
                    IdPedidoTipoPagamento = checkOut.IdPedidoTipoPagamento, 
                    IdEntregador = null,
                    IdPedidoStatus = 1, 
                    DataPedido = DateTime.Now,
                    DataEntrega = null,
                    HorarioAgendado = null,
                    TaxaServico = checkOut.PedidoAtendimentoTaxa
                };
                _context.Pedido.Add(pedido);
                await _context.SaveChangesAsync()
                .ConfigureAwait(false);
                int lastPedido = pedido.IdPedido;

                   List<Carrinho> cart = JsonSerializeSessionHelper.Get<List<Carrinho>>(HttpContext.Session, "cart");
                foreach (var item in cart)
                {
                    var pedidoItens = new PedidoItens
                    {
                        IdPedido = lastPedido,
                        IdProduto = item.IdProduto,
                        IdProdutoTamanho = item.IdProdutoTamanho,
                        IdProdutoTipoMassa = item.IdProdutoTipoMassa,
                        IdProdutoMeia = item.IdProdutoMeia,
                        Quantidade = item.Quantidade,
                        Preco = item.Preco
                    };
                    _context.PedidoItens.Add(pedidoItens);
                }
                await _context.SaveChangesAsync()
                    .ConfigureAwait(false);
                TempData["save"] = "Pedido realizado com sucesso";

                HttpContext.Session.Remove("cart");
            }
            else
            {
                return RedirectToAction("Index", "Login");
            }
            return RedirectToAction("Index", "Pedido");
        }
        return View(checkOut);
    }

看法

 @using (Html.BeginForm("CheckOut", "Carrinho", FormMethod.Post))
 {
      <button type="submit" class="btn btn-info btn-sm">
         Pagar (R$ @(@ViewBag.SubTotal + Model.PedidoAtendimentoTaxa))
      </button>

     // I need these values for Bind!!

     @*@Html.DisplayFor(m => m.IdPedidoAtendimento)
     @Html.DisplayFor(m => m.PedidoAtendimentoTaxa)
     @Html.DisplayFor(m => m.HorarioAgendado)
     @Html.DisplayFor(m => m.IdPedidoTipoPagamento)
     @Html.DisplayFor(m => m.IdUnidadeUsuario)*@

     <input asp-for="IdPedidoAtendimento" value="@Model.IdPedidoAtendimento" id="txtIdPedidoAtendimento" name="txtIdPedidoAtendimento" hidden/>
     <input asp-for="PedidoAtendimentoTaxa" value="@Model.PedidoAtendimentoTaxa" id="txtPedidoAtendimentoTaxa" name="txtPedidoAtendimentoTaxa" hidden/>
     <input asp-for="HorarioAgendado" value="@Model.HorarioAgendado" id="txtHorarioAgendado" name="txtHorarioAgendado" hidden />
     <input asp-for="IdPedidoTipoPagamento" value="@Model.IdPedidoTipoPagamento" id="txtIdPedidoTipoPagamento" name="txtIdPedidoTipoPagamento" hidden/>
     <input asp-for="IdUnidadeUsuario" value="@Model.IdUnidadeUsuario" id="txtIdUnidadeUsuario" name="txtIdUnidadeUsuario" hidden/>
  }

模型绑定基于name属性发生。 您已注释掉了@Html.DisplayFor行,因此它在那里没有绑定。 对于<input>字段,您已手动输入名称txt<PropertyName> ,因此它也不会绑定到这些字段。

ASP.NET 将自动创建一个适当的name属性,只需使用asp-for属性来适应模型绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM