检查枚举属性是否为空
本文关键字:是否 属性 枚举 检查 | 更新日期: 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();
}