2010-01-12 20 views
2

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; 
     } 
    } 
+0

代码供我们审查? –

+0

你得到它的工作?同样的问题在这里...... – Etienne

+0

编号我主要通过后端的服务器端验证切换到主要客户端验证(主要通过jQuery字母数字插件),而没有完全描述性的错误消息作为后备。这个系统的用户都是我公司的内部人员,我可以确保他们总是启用JavaScript,所以后端验证只是一种安全措施,所以不需要很好的错误消息。 – Alistair

回答

1

我确实打击了类似的问题,什么是疏通模型状态,验证对ModelState["XXXX"].Value.AttemptedValue而不是针对试图投入的无效价值将有效值输入到模型的属性中,填充错误消息并重新设置模型值。

这样我就可以得到我想要的错误消息,如果需要的话可以提供多个(“需要值”或“值必须是数字”)。

+0

有趣的是,DataAnnotations验证没有达成,所以我不能使用这种方法。我决定只使用jquery字母数字插件来停止输入非数字数据。在某些情况下,您仍然可以通过此验证,但总体而言,解决方案已足够好。 – Alistair

0
+0

尝试过这种方式,但它不起作用。 – Alistair

+0

尝试此链接: http://stackoverflow.com/questions/1538873/how-to-replace-the-default-modelstate-error-message-in-asp-net-mvc-2/1540874#1540874 如果您使用的是asp.net mvc 2 rc,请将InvalidPropertyValue更改为PropertyValueInvalid。 –

0

我已经争夺这对于大多数对MVC4 RC的一天。不管我设什么

DefaultModelBinder.ResourceClassKey 

它似乎从来没有工作。当我分配垃圾时,它也从未抛出异常。

这是我用指定的值(无济于事)什么:

DefaultModelBinder.ResourceClassKey = typeof(App_GlobalResources.ValidationMessages).Name; 

在最后,我决定来解决客户端上的此错误消息,并重写数据属性是jQuery使用到显示消息。

@Html.TextBoxFor(m => m.Amount, new Dictionary<string,object>(){{"data-val-number","Invalid Number"}}) 

这是我的工作方式,我需要它。

讽刺的是这个工程太:

@Html.TextBoxFor(m => m.Amount, new Dictionary<string, object>() {{ "data-val-number", HttpContext.GetGlobalResourceObject("ValidationMessages", "PropertyValueInvalid") } }) 
0

在这里,我已经采取联系人号码字段为字符串,但使用范围属性等都可以提供数字validatioin如果从你的资源文件来使用。

[Required(ErrorMessageResourceType = typeof(Global), ErrorMessageResourceName = "ContactNumberRequired")] 
    [Range(0, int.MaxValue, ErrorMessageResourceType = typeof(Global), ErrorMessageResourceName = "ValidContactNumber")] 
    [Display(Name = "Contact Number")] 
    public string ContactNumber { get; set; } 

所以现在这里提供了ErrorMessageResourceName作为关键。您可以自定义和使用它也在多语言

相关问题