正在验证C#MVC中的枚举值.发生部分验证-如何更改验证行为
本文关键字:验证 生部 何更改 C#MVC 枚举 | 更新日期: 2023-09-27 18:26:57
我一直将我的剃刀视图中的一个枚举表示为一个隐藏字段,它被发布回操作结果。
我注意到,当它绑定HTML中提供的字符串值时,它会自动验证枚举的值。
/// <summary>
/// Quiz Types Enum
/// </summary>
public enum QuizType
{
/// <summary>
/// Scored Quiz
/// </summary>
Scored = 0,
/// <summary>
/// Personality Type Quiz
/// </summary>
Personality = 1
}
剃刀:
@Html.HiddenFor(x => x.QuizType)
渲染HTML:
<input data-val="true" data-val-required="Quiz Type is not valid" id="QuizType" name="QuizType" type="hidden" value="Scored">
如果我将DOM中的值更改为不正确的值并提交表单,ModelState.IsValid
将返回false
,并且以下错误将添加到ModelState:
"The value 'myincorrectvalue' is not valid for QuizType."
这些都是肉汁,但我认为如果我创建了一个视图模型,就必须在视图模型上显式地设置验证规则,比如[Required]
属性。
此外,还有一个专门用于此的验证属性,称为EnumDataType
。
[EnumDataType(typeof(QuizType))]
public QuizType QuizType { get; set; }
问题
如果绑定时自动进行验证,那么EnumDataType
数据验证属性的意义何在?
好的,我已经找到了自己问题的答案。
出现的错误消息更像是无法绑定时的一般错误消息。当绑定尝试将从HTML发布的枚举值的不存在的字符串表示绑定到枚举时,它会产生错误:
The value 'myincorrectvalue' is not valid for QuizType.
如果尝试将字符串值绑定到视图模型类中的int
,则会出现完全相同的错误消息。
问题似乎是,除了字符串表示外,枚举还可以是任何整数值。我可以将枚举设置为任何数字,即使该数字在我的枚举中不存在。
/// <summary>
/// Quiz Types Enum
/// </summary>
public enum QuizType
{
/// <summary>
/// Scored Quiz
/// </summary>
Scored = 0,
/// <summary>
/// Personality Type Quiz
/// </summary>
Personality = 1
}
因此,这是有效的,并且将毫无错误地绑定到我的枚举值,即使1000
在我的枚举中不存在:
<input data-val="true" id="QuizType" name="QuizType" type="hidden" value="1000">
// Binder will bind this just fine
QuizType = 1000
这就是EnumDataType
验证属性的作用
[EnumDataType(typeof(QuizType), ErrorMessage = "Quiz type value doesn't exist within enum")]
public QuizType QuizType { get; set;}
有了该属性,我将只能分配有效的枚举值(本例为0或1)。
因此,从HTML发布的不正确的STRING表示在绑定时会自动为您验证,但检查任何整数值都不会。
我希望这可以清除ASP.NET MVC中验证ENUMS的问题。