检查枚举属性是否为空

本文关键字:是否 属性 枚举 检查 | 更新日期: 2023-09-27 18:15:39

我有一个enum属性,我用它来填充下拉列表,作为我的表单的一部分,看起来像这样:

 public class MyModel
{
    [Required]
    [DisplayName("Type of Enum")]
    public EnumType? Type { get; set; }
}
public enum EnumType
{
    option1 = 1,
    option2 = 2,
    option3 = 3,
    option4 = 4
}

表单提交到另一个控制器,在那里我试图检查null在enum类型:

 public class ResultController : Controller
{
    // GET: Result
    [AllowAnonymous]
    public ActionResult Index(MyModel model)
    {
        if(!Enum.IsDefined(typeof(MyEnum), model.EnumType))
        {
            return RedirectToAction("Index", "Home");
        }           
        return View();
    }
}

当我尝试..../result?Type=5时,RedirectToAction工作,但当我尝试..../result?Type=时,我得到ArgumentNullException

注意:在枚举中添加None=0对我来说不是一个选项,我不希望在下拉列表中没有显示。

如何在控制器中检查null ?在这方面是否存在最佳实践?

检查枚举属性是否为空

IsDefined()中使用该值前,明确检查该值是否为null

public ActionResult Index(MyModel model)
{
    if(!model.EnumType.HasValue)
    {
        return RedirectToAction("Index", "Home");
    }           
    if(!Enum.IsDefined(typeof(MyEnum), model.EnumType))
    {
        return RedirectToAction("Index", "Home");
    }           
    return View();
}

较短的版本是使用空合并运算符在调用IsDefined()时使用0而不是null:

public ActionResult Index(MyModel model)
{
    if(!Enum.IsDefined(typeof(MyEnum), model.EnumType ?? 0))
    {
        return RedirectToAction("Index", "Home");
    }           
    return View();
}

首先,根据您的模型,需要Type属性。

public class MyModel
{
    [Required]
    [DisplayName("Type of Enum")]
    public EnumType? Type { get; set; }
}

其次,您需要检查枚举值是否确实定义在EnumType声明中,然后您不需要在操作中调用Enum.isDefined方法。只需用数据注释属性EnumDataType(typeof(EnumType))来装饰您的Type属性,这将完成该工作。所以你的模型看起来像这样:

public class MyModel
{
    [Required]
    [EnumDataType(typeof(EnumType))]
    [DisplayName("Type of Enum")]
    public EnumType? Type { get; set; }
}

最后,在你的控制器动作中清理它,让它看起来像这样:

// GET: Result
[AllowAnonymous]
public ActionResult Index(MyModel model)
{
    // IsValid will check that the Type property is setted and will exectue 
    // the data annotation attribute EnumDataType which check that 
    // the enum value is correct.
    if (!ModelState.IsValid) 
    {
        return RedirectToAction("Index", "Home");
    }
    return View();
}