当为输入字段asp.net mvc输入不正确的数据类型时,覆盖错误消息(值’xxx’对Age无效)

我在HTML表单的输入字段中输入错误的数据类型时尝试覆盖错误消息。 例如,我有这样的模型。

public class Person { public string FirstName {get;set;} public int Age {get;set;} } 

为了查看,我为Age添加了文本输入以获取它的值。

在Age文本框中键入一些字符串,如’test’,然后按提交按钮。 我收到此错误消息

值’xxx’对Age不起作用

但是,我想改变这个消息并尝试很多方法。 这个消息值没有任何影响。

请你帮我解决这个问题。

您可以使用DataAnnotations覆盖MVC中的默认错误消息,并为您需要的任何字段提供自己的validation。 请参阅以下内容:

http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

如果您使用的是EF,则需要在EF生成的类中创建一个MetaData类,然后添加数据注释。 第2篇文章的结尾介绍了如何为entity framework编写这些类。

在您的具体情况下,您将需要执行以下操作:

 using System.ComponentModel.DataAnnotations; public class Person { public string FirstName {get;set;} [Range(0, 110, ErrorMessage = "")] public int Age {get;set;} } 

更新我忘记了一件容易被忽视的事情,你需要包含以下JS文件,以便在客户端获取数据注释而无需发布post:

  • MicrosoftAjax.js

  • MicrosfotMvcValidation.js

这些应该存储在项目的Scripts文件夹中(如果您使用的是MVC 2),并且需要将它们包含在您的页面或母版页中,

   

你还需要包括

<% Html.EnableClientValidation(); %>

在相关页面上。

在所有字段满足validation要求之前,客户端validation不允许您提交表单,因为Kaspars Ozols指出您仍需要在控制器上调用Model.IsValid。

花了几个小时环顾四周后,我发现没有人真的有合适的答案。 我找到了一个适合我的解决方案,所以我想我会发布它。

对我来说问题是validation可以为空的int。 当用户输入无效值时,默认消息“值’dsfd’对Issue’无效。

我想出的解决方案是从模型状态中删除错误并添加我自己的错误。

执行validation的类如下:

 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false)] public class ValidInteger : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || value.ToString().Length == 0) { return ValidationResult.Success; } int i; return !int.TryParse(value.ToString(), out i) ? new ValidationResult(ErrorMessage) : ValidationResult.Success; } } public class ValidIntegerValidator : DataAnnotationsModelValidator { public ValidIntegerValidator(ModelMetadata metadata, ControllerContext context, ValidInteger attribute) : base(metadata, context, attribute) { if(!attribute.IsValid(context.HttpContext.Request.Form[attribute.ObjectId])) { var propertyName = metadata.PropertyName; context.Controller.ViewData.ModelState[propertyName].Errors.Clear(); context.Controller.ViewData.ModelState[propertyName].Errors.Add(attribute.ErrorMessage); } } } 

不要忘记你还需要在全局Application_Start()中注册适配器

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidInteger), typeof(ValidIntegerValidator)); 

并使用新属性装饰您的属性

 [ValidInteger(ErrorMessage = "Please enter a valid number for issue")] 

2月27日12日wechel的回复对我有用,除了我需要更换线路

  if(!attribute.IsValid(context.HttpContext.Request.Form[attribute.ObjectId])) 

  if (!attribute.IsValid(context.HttpContext.Request.Form[metadata.PropertyName])) 

我猜测需要进行更改,因为我使用的是MVC4并且提供的代码片段是在早期版本的MVC中编写的?