【问题标题】:asp.net mvc int property bind exceptionasp.net mvc int 属性绑定异常
【发布时间】:2010-08-10 16:36:04
【问题描述】:

我的班级中有一个 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.

【问题讨论】:

  • 我正在使用字符串并尝试将其转换为 int,但我认为这不是验证此问题的正确方法。
  • 现在发生的事情有什么问题?模型绑定器正在验证 int 就好了。
  • 我认为你想要的可能是一个例外。查看HandleError 属性。
  • 您能说明一下您想要达到的结果吗?
  • 我想向用户显示自定义错误消息。

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


【解决方案1】:

这里有两个验证阶段。

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

所以这里有几个基于这段代码的例子:

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

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

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

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

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

** 解决方案**

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

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

[Bind(Exclude="MyNumber")]

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

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

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

【讨论】:

  • MVC3 是否让 Sohnee 的解决方案更容易?
【解决方案2】:

你可以像这样在你的模型字段上放置一个范围属性:

[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;}

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2012-05-07
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多