c# - asp.net mvc int 属性绑定(bind)异常

标签 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.

最佳答案

这里有两个验证阶段。

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

这里有几个基于此代码的示例:

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

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

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

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

“值“A”对于 Number 无效。” (框架无法将“A”转换为可为 null 的 int,因此框架验证规则失败,并且未检查您的验证规则。

** 解决方案 **

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

2 - 从绑定(bind)器中排除该值,这样就不会导致错误(但您必须绑定(bind)它并自己检查)

[Bind(Exclude="MyNumber")]

3 - 将其设为模型上的字符串,然后使用 TryParse 对其进行测试并添加您自己的自定义模型错误(这是一种合理的做法,并提醒我们所有人为什么使用 View 模型而不是域对象!)

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

实际上有很多解决方案,但我建议现在使用选项 3。

关于c# - asp.net mvc int 属性绑定(bind)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451255/

相关文章:

c# - serilog通过.net核心中的记录器引用为对象建立索引

c# - 为什么为资源文件生成的类在具有不同名称的文件中?

javascript - 如何使用 jQuery 等待替换

.net - CS0012 : The type 'System.Web.Routing.RouteValueDictionary' is defined in an assembly that is not referenced

docker - 无法在 COCO 注释器中创建数据集和加载图像

c# - DataAnnotations 在 MVC 中是如何工作的?

应为 C# 方法名称

c# - 使用用户定义的参数调用存储过程

mysql - 使用 LINQ 构建动态查询

c# - 数据注释 - DisplayFormat - 格式化数字字符串