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

Model Binding properties null on asp.net core 3 MVC

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

解释:

我的 Controller Index 看起来不错,所以在我的 View 中我可以看到我想要绑定的所有输入值都已填充( IdPedidoAtendimento,PedidoAtendimentoTaxa,HorarioAgendado,IdPedidoTipoPagamento,IdUnidadeUsuario)。

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

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

ViewModel

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/>
  }

Model binding 基于 name 属性出现。您已将 @Html.DisplayFor 行注释掉,因此它在那里没有约束力。对于 <input> 字段,您手动输入了 txt<PropertyName> 的名称,因此它也不对这些字段具有约束力。

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