asp.net mvc int属性绑定异常

时间:2010-08-10 16:36:05

标签: c# asp.net-mvc data-annotations

我的类中有一个int属性,想验证用户是否输入了字符串。 如何使用数据注释来做到这一点? 当我传递一个非整数值时,我会得到这样的删除:

The value 'asdasd' is not valid for property.

例如,使用此验证属性:

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }

并在使用该模型的字段中输入'aaa'我对此消息有所了解:

The value 'aaa' is not valid for Number.

而不是“无效号码”消息。

任何想法?


我已经把

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }

但是我从这个消息中得到了这条消息

The value 'aaa' is not valid for Number.

2 个答案:

答案 0 :(得分:6)

这里有两个阶段的验证。

在调用属性中的验证设置之前,框架首先尝试解析信息。

以下是基于此代码的几个示例:

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }

我没有在框中输入任何内容......

“无效数字”(框架将创建一个空整数,您的验证规则失败)

我在框中输入“A”......

“值'A'对数字无效。” (框架无法将“A”转换为可以为空的int,因此框架验证规则失败,并且未检查验证规则。

**解决方案**

1 - 使用默认消息直到您使用MVC 3 / .NET 4,这样可以更轻松地覆盖这些消息

2 - 从活页夹中排除值,因此不会导致错误(但您必须将其绑定并自行检查)

[Bind(Exclude="MyNumber")]

3 - 在模型上创建一个字符串,然后使用TryParse测试它并添加您自己的自定义模型错误(这是一种合理的做法,并提醒我们所有使用View模型而不是Domain Objects的原因!)

if (!Int32.TryParse("MyNumber", out myInteger)) {
    ModelState.AddModelError("MyNumber", "That isn't a number!");
}

实际上有很多解决方案,但我现在会说选择3。

答案 1 :(得分:0)

你可以在你的模型字段上放置一个Range属性,如下所示:

[Range(0, 9999)]
public int Something {get; set;}

现在每当用户输入一个字符串时它就不会被验证,并且int也必须在0-9999之间

这也适用于

[Range(0, 9999)]
public string Something {get; set;}

[Range(0, 9999)]
public object Something {get; set;}