【发布时间】: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]属性,您也会看到<input data-val="true" data-val-required="The ID field is required." ...>
标签: c# asp.net-mvc razor validation validationattribute