我有以下实体:
public class Ambiente
{
public int AmbienteId { get; set; }
[Display(Name ="Codigo del Ambiente")]
[StringLength(10, ErrorMessage ="El ancho máximo es de 10 caracteres")]
public string Codigo { get; set; }
[Display(Name ="Nombre del Ambiente")]
[StringLength(50, ErrorMessage ="El ancho máximo es de 50 caracteres")]
public string Nombre { get; set; }
[Required(ErrorMessage ="Especifique una etapa")]
[Display(Name ="Nombre de la Etapa")]
public Etapa Etapa { get; set; }
}
如您所见,此类具有引用名为Etapa的实体的属性
public class Etapa
{
public int EtapaId { get; set; }
[Required(ErrorMessage ="Especifique un nombre de Etapa")]
[StringLength(20, ErrorMessage = "El ancho maximo es de 20")]
[Display(Name ="Nombre de la Etapa")]
public string Nombre { get; set; }
}
此类Etapa对属性Nombre进行了验证。现在关于Ambiente类,在提交数据以插入数据库时,我在Insertar Action中使用以下代码:
[HttpPost]
public IActionResult Insertar(Ambiente ambiente)
{
if (ModelState.IsValid)
{
try
{
_ambienteRepository.Insertar(ambiente);
return RedirectToAction("Index");
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
}
}
var ambienteViewModel = ObtenerAmbienteViewModel(ambiente);
return View(ambienteViewModel);
}
当此代码到达ModelState.IsValid语句时,它将抛出false并显示以下消息:
“ Etapa的特殊性”
这是我的Etapa类的Nombre财产的文本。
当我从“插入动作”中的参数快速查看变量环境变量时,会看到以下内容:
此Etapa实体用于填充我视图中的下拉列表。所有值都已经存在于数据库中,因此我无意向该实体添加记录。
我不知道如何绕过此引用实体Etapa的验证。
答案 0 :(得分:0)
通常的方法是创建一个视图模型,不包括Etapa
属性。在插入数据库之前,将值分配给服务器端的Ambiente
对象。
如果您不想更改任何内容。根据您的代码,您可以忽略Etapa的模型状态错误,但这不是一个好主意:
ModelState.Remove("Etapa");
然后分配所需的Etapa
以确保Nombre
不为空。代码将如下所示:
ModelState.Remove("Etapa");
if (ModelState.IsValid)
{
var etapa = _context.Etapa.First(a => a.EtapaId == ambiente.Etapa.EtapaId);
ambiente.Etapa = etapa;
_context.Add(ambiente);
await _context.SaveChangesAsync();
.....
}