ModelState正在验证插入中的ID

时间:2019-06-11 05:00:29

标签: c# asp.net

我试图将创建和编辑动作合并到保存动作中,但是由于某些原因,当我尝试插入新的Cliente时,modelState尝试验证ID列。如果我注释掉视图中的隐藏字段ID,它就可以工作。 请给我一个线索!?

查看

@model WebApplicationCursoASPNET_V3.ViewModels.FormularioClienteViewModel
@{
    ViewBag.Title = "Novo";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2> Cliente</h2>

@using (@Html.BeginForm("Gravar", "Cliente"))
{

    <div class="form-group">
        @Html.LabelFor(m => m.cliente.Nome)
        @Html.TextBoxFor(m => m.cliente.Nome, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.cliente.Nome, "", new { @class = "text-danger" })
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.cliente.TipoAssinaturaId)
        @Html.DropDownListFor(m => m.cliente.TipoAssinaturaId, new SelectList(Model.tiposAssinatura, "Id", "Nome"), "<< Selecione a assinatura >>", new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.cliente.TipoAssinaturaId, "", new { @class = "text-danger" })
    </div>
     <div class="form-group">
        @Html.LabelFor(m => m.cliente.Aniversario)
        @Html.TextBoxFor(m => m.cliente.Aniversario, "{0:d}", new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.cliente.Aniversario)
    </div>
    <div class="checkbox">
        <label>
            @Html.CheckBoxFor(m => m.cliente.EstaInscritoEmAssinaturas) Está inscrito em assinaturas
        </label>
    </div> 
    @Html.HiddenFor(m => m.cliente.Id)
    @Html.ValidationMessageFor(m => m.cliente.Id, "", new {@class="text-danger"})
    <br>
    <button type="submit" class="btn btn-primary">Gravar</button>
}

控制器

 [HttpPost]
        public ActionResult Gravar(FormularioClienteViewModel dadosFormulario)
        {
            if (dadosFormulario.cliente.Id == 0)
            {
                if (ModelState.IsValid)
                {
                    _context.Clientes.Add(dadosFormulario.cliente);
                    _context.SaveChanges();
                    return RedirectToAction("Index", "Cliente");
                }

                var vwModel = new FormularioClienteViewModel
                {
                    cliente = dadosFormulario.cliente,
                    tiposAssinatura = _context.TipoAssinaturas.OrderBy(m => m.Nome).ToList()
                };
                return View("Form", vwModel);
            }

            var clienteDB = _context.Clientes.SingleOrDefault(c => c.Id == dadosFormulario.cliente.Id);
            if (clienteDB == null)
            {
                return HttpNotFound();
            }

            clienteDB.Nome = dadosFormulario.cliente.Nome;
            clienteDB.TipoAssinaturaId = dadosFormulario.cliente.TipoAssinaturaId;
            clienteDB.Aniversario = dadosFormulario.cliente.Aniversario;
            clienteDB.EstaInscritoEmAssinaturas = dadosFormulario.cliente.EstaInscritoEmAssinaturas;
            _context.SaveChanges();
            return RedirectToAction("Index", "Cliente");
        }

型号

 public class Cliente
    {
        public int Id { get; set; }

        [Display(Name = "Nome do cliente")]
        [Required]
        [StringLength(255,ErrorMessage = "Tamanho máximo de 255 caracteres")]
        public string Nome { get; set; }

        [Display(Name = "Está inscrito em assinaturas")]
        public bool EstaInscritoEmAssinaturas { get; set; }

        public TipoAssinatura TipoAssinatura { get; set; }

        [Display(Name = "Tipo de assinatura")]
        public int TipoAssinaturaId { get; set; }

        public DateTime? Aniversario { get; set; }
    }

错误消息:O Campo Idéobrigatório。 /必填字段ID

1 个答案:

答案 0 :(得分:1)

理想情况下,建议使用不同的调用来使用不同的DTO保存和更新。

以您的情况而言,现在您需要使ID为可空并在Update中使用自定义逻辑对其进行验证。

public int? Id { get; set; }