【发布时间】:2019-04-05 03:38:40
【问题描述】:
我正在开发一个基于 EntityFrameworkCore 并以 ASP.NET Core 2.1 为目标的网站。我想为模型中的枚举字段指定错误消息,如下所示:
[Required(ErrorMessage = "Select an item from the list.")]
public MyEnum MyEnum { get; set; }
但是,仍然会生成股票消息:The value '0' is invalid。问题似乎是在评估我的任何代码之前验证了 Enum 类型。这里介绍的两种方法 (https://www.codeproject.com/Articles/1204077/ASP-NET-Core-MVC-Model-Validation),要么创建一个从 ValidationAttribute 继承的类,要么让模型从 IValidatableObject 继承,这两种方法都受此影响。
我找到了解决方法:将字段声明为 int,然后使用自定义验证属性:
[EnumCheck(typeof(MyEnum), ErrorMessage = "Select an item form the list.")]
public int MyEnum { get; set; }
...然后是 ValidationAttribute 的子类:
sealed public class EnumCheck : ValidationAttribute
{
readonly Type t_;
public EnumCheck(Type t)
{
t_ = t;
}
public override bool IsValid(object value)
{
return Enum.IsDefined(t_, value);
}
}
这种方法有一些缺点,因为现在我需要在许多使用它的地方将字段转换为 Enum 类型。
有没有办法为 Enum 字段类型提供 ErrorMessage?
更新
以下是一个最小示例(不再使用 ValidationAttribute 的 EnumCheck 子类,而是使用 @PéterCsajtai 提到的 EnumDataType):
型号
namespace web.Models
{
public enum Day
{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
public class Form
{
[EnumDataType(typeof(Day), ErrorMessage = "Select an item from the list.")]
public Day Day { get; set; }
}
}
控制器
namespace web.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Save(Form model)
{
if(!ModelState.IsValid)
{
return View("Index");
}
return View("Index", model);
}
}
}
查看
<form asp-controller="Home">
<div asp-validation-summary="All" class="text-danger"></div>
<fieldset>
<label asp-for="@Model.Day"></label>
<select asp-for="@Model.Day" asp-items="Html.GetEnumSelectList<Day>()">
<option value="">Select...</option>
</select>
@Html.ValidationMessageFor(m => m.Day)
<span asp-validation-for="@Model.Day" class="text-danger"></span>
</fieldset>
<fieldset>
<input type="submit" asp-action="Save" />
</fieldset>
</form>
以及表单发布后的输出:
【问题讨论】:
-
枚举是一个整数。也许0是你的问题。您是否尝试将第一个枚举设置为 1?
-
@Manta 是的,我有。事实上,这就是我第一次注意到这个问题的方式。 MyEnum 是从一个选择框填充的,它最初只包含枚举中的每个元素。然后我决定去掉列表顶部的“选择一个...”选项,并将其值设置为 0。
-
有点像你在搜索这个:stackoverflow.com/q/14381564/125981
标签: c# enums asp.net-core-2.1 validationattribute ivalidatableobject