验证C#MVC中的枚举值.部分验证发生 - 如何更改验证行为?

Luk*_*uke 13 c# validation asp.net-mvc validationattribute razor

我一直在剃刀视图中将枚举表示为隐藏字段,并将其发布回动作结果.

我注意到,当它绑定HTML中提供的字符串值时,它会自动验证枚举的值.

/// <summary>
/// Quiz Types Enum
/// </summary>
public enum QuizType
{
    /// <summary>
    /// Scored Quiz
    /// </summary>
    Scored = 0,

    /// <summary>
    /// Personality Type Quiz
    /// </summary>
    Personality = 1
}
Run Code Online (Sandbox Code Playgroud)

剃刀:

@Html.HiddenFor(x => x.QuizType)
Run Code Online (Sandbox Code Playgroud)

呈现的HTML:

<input data-val="true" data-val-required="Quiz Type is not valid" id="QuizType" name="QuizType" type="hidden" value="Scored">
Run Code Online (Sandbox Code Playgroud)

如果我将DOM中的值更改为不正确的值并提交表单,则ModelState.IsValid返回false并将以下错误添加到ModelState:

"The value 'myincorrectvalue' is not valid for QuizType."
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但我认为如果我创建了一个视图模型,我必须在我的视图模型上显式设置验证规则,例如[Required]属性.

此外,还有一个专门针对此调用的验证属性EnumDataType.

[EnumDataType(typeof(QuizType))]
public QuizType QuizType { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果验证在绑定时自动发生,那么EnumDataType数据验证属性中的要点是什么?

Luk*_*uke 34

好的,所以我找到了自己问题的答案.

出现的错误消息更多是无法进行绑定时的一般错误消息.当绑定尝试将从HTML发布的枚举值的不存在的字符串表示绑定到枚举时,它会产生错误:

The value 'myincorrectvalue' is not valid for QuizType.
Run Code Online (Sandbox Code Playgroud)

如果我尝试将字符串值绑定到intView Model类中,则会出现完全相同的错误消息.

似乎问题是除了字符串表示之外,枚举可以是任何整数值.我可以将枚举设置为任何数字,即使我的枚举中不存在该数字.

/// <summary>
/// Quiz Types Enum
/// </summary>
public enum QuizType
{
    /// <summary>
    /// Scored Quiz
    /// </summary>
    Scored = 0,

    /// <summary>
    /// Personality Type Quiz
    /// </summary>
    Personality = 1
}
Run Code Online (Sandbox Code Playgroud)

因此,这是有效的,并且会在没有错误的情况下绑定到我的枚举值,即使我的枚举1000中不存在:

<input data-val="true" id="QuizType" name="QuizType" type="hidden" value="1000">

//  Binder will bind this just fine
QuizType = 1000
Run Code Online (Sandbox Code Playgroud)

这就是EnumDataType验证属性的来源.如果我在我的视图模型中将验证属性添加到我的枚举中:

[EnumDataType(typeof(QuizType), ErrorMessage = "Quiz type value doesn't exist within enum")]
public QuizType QuizType { get; set;}
Run Code Online (Sandbox Code Playgroud)

使用该属性,我将只能分配有效的枚举值(此示例为0或1).

因此,在绑定时会自动验证从HTML发布的错误STRING表示,但不检查任何整数值.

我希望这可以在ASP.NET MVC中清除验证ENUMS.