当为输入字段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中编写的?