ModelState.IsValid正在验证引用的实体

时间:2018-12-11 16:16:46

标签: asp.net-core asp.net-core-mvc asp.net-core-mvc-2.1

我有以下实体:

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财产的文本。

enter image description here

当我从“插入动作”中的参数快速查看变量环境变量时,会看到以下内容:

enter image description here

此Etapa实体用于填充我视图中的下拉列表。所有值都已经存在于数据库中,因此我无意向该实体添加记录。

enter image description here

我不知道如何绕过此引用实体Etapa的验证。

1 个答案:

答案 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();
    .....
}