【问题标题】:Validating Enum Values within C# MVC. Partial validation occurs - How to change validation behaviour?在 C# MVC 中验证枚举值。发生部分验证 - 如何更改验证行为?
【发布时间】:2014-12-13 01:12:22
【问题描述】:

我一直在我的 razor 视图中将枚举表示为隐藏字段,该字段被发布回操作结果。

我注意到,当它绑定 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 数据验证属性的意义何在?

【问题讨论】:

  • 始终需要一个 enum 值(不能为空),以便添加验证。如果您不希望它是必需的,请将其设为可空 public QuizType? QuizType { get; set; }
  • 确实,但我没有将其设置为null,我将其设置为枚举中未包含的值
  • 另外,int 是不可为空的,但如果我将其设置为 null,它只会被绑定为 0... 这样就不会执行自动验证。它在哪里记录了哪些类型会/不会自动验证?
  • 我刚刚尝试将int 设置为任意字符串值,但出现了类似的错误。我认为对于设置为该类型的错误值的任何值,它都必须出现此错误,但似乎绑定显式检查了从 HTML 发送的字符串值与枚举中的实际文本。如果我根本没有在 HTML 中设置值,则不会自动设置此错误。
  • 是的。如果将文本框绑定到 int 并清除文本框,您将收到验证错误(检查 html,即使您不添加 [Required] 属性,您也会看到 &lt;input data-val="true" data-val-required="The ID field is required." ...&gt;

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


【解决方案1】:

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

出现的错误消息更像是无法绑定时的一般错误消息。当绑定尝试将从 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。

【讨论】:

  • 很高兴能帮上忙!这让我困惑了一段时间。
猜你喜欢
  • 1970-01-01
  • 2017-07-03
  • 2010-09-06
  • 2017-12-14
  • 2019-06-05
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多