DataAnnotations的工作方式似乎有一些漏洞,用户将某些文本输入到将进入int永远不会到达DataAnnotations代码。它启动了模型绑定错误并向用户显示错误“值'a'对于XXXX字段无效。”ASP.NET MVC:DataAnnotations - 显示一个错误消息,指出一个字段必须是数字的
无论如何,它自动处理这种情况非常好,但我实际上想要显示一个错误消息,指出问题,例如。 “值'a'不是数字,请输入XXXX字段的数字值。”
我试过解决方案How to replace the default ModelState error message in Asp.net MVC 2?和ASP.NET MVC - Custom validation message for value types,但我无法让他们工作。
看来我的资源文件根本没有被读取,因为在这里()它声明“如果属性设置为无效的类密钥(例如不存在的资源文件),MVC会抛出一个例外。”即使我将该行更改为DefaultModelBinder.ResourceClassKey =“asdfasdhfk”,也没有例外。
任何人有任何想法?
编辑:这是一些代码。所有它正在工作减去我的Messages.resx文件的消息没有被使用。 Messages.resx的代码是自动生成的,所以我不会包含它。
因此,在ProcessOrder中输入“a”将产生一条通用消息,而不是我为MessageValueInvalid(和InvalidPropertyValue中的好措施)输入Messages.resx。
Application_Start方法中
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder(); //set dataanooations to be used
DefaultModelBinder.ResourceClassKey = "Messages"; //set data annotations to look in messages.resx for the default messages
ValidationExtensions.ResourceClassKey = "Messages";
}
实体类
[MetadataType(typeof(GLMetaData))]
public partial class GL
{
}
public class GLMetaData
{
public int TransRefId { get; set; }
[DisplayName("Process Order")]
public int? ProcessOrder { get; set; }
[DisplayName("Trans Type")]
[StringLength(50)]
public string TransType { get; set; }
[StringLength(100)]
public string Description { get; set; }
[DisplayName("GL Code")]
[StringLength(20)]
public string GLCode { get; set; }
[DisplayName("Agents Credit No")]
[StringLength(50)]
public string AgentsCreditNo { get; set; }
[Required]
public bool Active { get; set; }
}
控制器动作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(GL glToBeUpdated)
{
try
{
if (!ModelState.IsValid)
return View(glToBeUpdated);
//set auto properties
glToBeUpdated.UpdateDate = DateTime.Now;
glToBeUpdated.UpdateUser = this.CurrentUser;
glDataLayer.update(glToBeUpdated);
glDataLayer.submitChanges();
return RedirectToAction("Index");
}
catch
{
glDataLayer.abortChanges();
throw;
}
}
代码供我们审查? –
你得到它的工作?同样的问题在这里...... – Etienne
编号我主要通过后端的服务器端验证切换到主要客户端验证(主要通过jQuery字母数字插件),而没有完全描述性的错误消息作为后备。这个系统的用户都是我公司的内部人员,我可以确保他们总是启用JavaScript,所以后端验证只是一种安全措施,所以不需要很好的错误消息。 – Alistair