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

标签 c# asp.net-mvc razor validation validationattribute

我一直在我的 razor View 中将一个枚举表示为一个隐藏字段,它被回传到一个操作结果中。

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

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

    /// <summary>
    /// Personality Type Quiz
    /// </summary>
    Personality = 1
}

Razor :

@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."

这都是肉汁,但我认为如果我创建了一个 View 模型,我必须在我的 View 模型上显式设置验证规则,例如 [Required] 属性。

还有一个名为 EnumDataType 的验证属性。

[EnumDataType(typeof(QuizType))]
public QuizType QuizType { get; set; }

问题

如果验证在绑定(bind)时自动发生,EnumDataType 数据验证属性有什么意义?

最佳答案

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

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

The value 'myincorrectvalue' is not valid for QuizType.

如果我尝试将字符串值绑定(bind)到 View 模型类中的 int,则会出现完全相同的错误消息。

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

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

    /// <summary>
    /// Personality Type Quiz
    /// </summary>
    Personality = 1
}

因此,这是有效的并且将毫无错误地绑定(bind)到我的枚举值,即使 1000 不存在于我的枚举中:

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

//  Binder will bind this just fine
QuizType = 1000

这就是 EnumDataType 验证属性的用武之地。如果我将验证属性添加到我的 View 模型中的枚举中:

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

有了这个属性,我将只能分配我的有效枚举值(本例中为 0 或 1)。

因此,从 HTML 发布的不正确的 STRING 表示会在绑定(bind)时自动为您验证,但不会检查任何整数值。

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

关于c# - 在 C# MVC 中验证枚举值。发生部分验证 - 如何更改验证行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26425242/

相关文章:

c# - 如何将 C# 8 中的默认返回值标记为仅对类可为空?

javascript - asp.net 将 javascript ajax 发送到用户控件

c# - 如何对 C# 类对象值进行分组。这可以用 LINQ 实现吗?

javascript - 等待 form.submit()/POST 完成

ASP.NET MVC : Ajax actionlink or Jquery solution?

asp.net-mvc - Azure Active Directory - 存储访问 token 的 MVC 应用程序最佳实践

asp.net-mvc - MVC 3 RC 中的 Razor 助手

c# - 处理 Excel Application.ScreenUpdating 中的异常 (0x800AC472)

asp.net-mvc - Visual Studio 在 razor 语句中显示语法错误但有效

jquery - 按钮将表单提交到 "Get"ActionResult 而不是 "Post"