我试图将创建和编辑动作合并到保存动作中,但是由于某些原因,当我尝试插入新的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
答案 0 :(得分:1)
理想情况下,建议使用不同的调用来使用不同的DTO保存和更新。
以您的情况而言,现在您需要使ID为可空并在Update中使用自定义逻辑对其进行验证。
public int? Id { get; set; }