2012-04-24 18 views
0

在我的模型我有一个是通过以下方式标注的某一特定领域:为什么MVC 3验证覆盖我的?

[DataType(System.ComponentModel.DataAnnotations.DataType.Text)] 
    [RegularExpression("[0-9]{1,10}", ErrorMessage = "The stated Attempt Id is invalid!")] 
    public long? AttemptId { get; set; } 

当我在尝试ID输入不正确的数据它给我的模型状态出现以下错误信息:

The value 'cbcbxcb' is not valid for AttemptId. 

我有其他领域有类似的错误消息,但他们的字符串类型而不是长?并在出现无效值的情况下显示正确的错误消息。为什么不是“长”的信息?正在使用?我在页面中使用folowing文字标记显示我的错误。

<%: Html.TValidationSummary() %> 

编辑:我曾尝试在模型中更改验证以下内容:

[Required(ErrorMessage="The stated Attempt Id is invalid!", AllowEmptyStrings=true)] 

然而,这仍是不正确。首先,我需要让该字段保持空白,当我这样做时,它会给我“所述的尝试标识无效!”。错误信息。其次,当我在字段中输入无效数据时,它将恢复为旧的错误消息。

回答

1

RegularExpression验证属性仅适用于字符串类型。要获取自定义错误消息,请改用Required验证属性,并将自己的自定义错误消息放入。

如果您的模型参数不是必需的,则可以在控制器内执行验证并使用自己的自定义消息ModelState.AddModelError方法 - 尽管这有点破绽。

+0

感谢您的回答。现在诀窍是该特定字段不是真正必需的字段,因此用户应该允许将其保留为空。有没有办法做到你的建议,而不是将其绑定为“必需”? – 2012-04-24 11:05:18

+0

我将验证更改为'[必需(ErrorMessage =“声明的尝试标识无效!”,AllowEmptyStrings = true)]',现在它显示错误消息,如果留空(它不应该)并仍然显示错误错误消息eif无效。 – 2012-04-24 11:26:58

+0

已经编辑过,如果你的参数是非强制性的,提供了一个替代解决方案 – DaveRead 2012-04-24 12:19:52

1

它可能是MVC绑定甚至无法将输入值转换为正确类型的事实,因此它已知道该值必须无效。

+0

好的,有没有办法让MVC在发生这种情况时使用我的消息? – 2012-04-24 10:39:11

+0

还没有尝试过,你可以尝试从另一个SO问题的这种方法:http://stackoverflow.com/questions/9173034/override-datatype-mismatch-message-of-property-in-asp-net-mvcand-display -messag – 2012-04-24 11:19:43

1

您应该使用FluentValidation

内置的使用属性验证的东西是易碎和肮脏 - 至少可以说。

+0

很乐意使用有用的东西,不幸的是,这不是一个个人项目,并且将第三方软件引入系统并不是一种选择。无论如何感谢您的建议。 – 2012-04-24 11:37:47