首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在MVC中更改由@Html helper生成的“data-val-number”消息验证

如何在MVC中更改由@Html helper生成的“data-val-number”消息验证
EN

Stack Overflow用户
提问于 2011-01-28 20:38:09
回答 11查看 76.1K关注 0票数 76

假设此模型:

代码语言:javascript
复制
Public Class Detail
    ...
    <DisplayName("Custom DisplayName")>
    <Required(ErrorMessage:="Custom ErrorMessage")>
    Public Property PercentChange As Integer
    ...
end class

视图:

代码语言:javascript
复制
@Html.TextBoxFor(Function(m) m.PercentChange)

将继续执行此html:

代码语言:javascript
复制
   <input data-val="true" 
    data-val-number="The field 'Custom DisplayName' must be a number." 
    data-val-required="Custom ErrorMessage"     
    id="PercentChange" 
    name="PercentChange" type="text" value="0" />

我想定制data-val-number错误消息,我猜是因为PercentChange是一个Integer而生成的。我一直在寻找这样的属性来改变它,range或任何相关的东西都不起作用。

我知道有机会编辑unobtrusive的js文件本身,或者在客户端覆盖它。我想要更改data-val-number的错误消息,就像服务器端的其他错误消息一样。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-01-29 02:27:33

这不是件容易的事。默认消息作为嵌入资源存储到System.Web.Mvc程序集中,正在获取的方法是内部密封内部类(System.Web.Mvc.ClientDataTypeModelValidatorProvider+NumericModelValidator.MakeErrorString)的私有静态方法。这就像是微软编码的家伙隐藏了一个最高机密:-)

您可以查看下面的blog post,它描述了一种可能的解决方案。您基本上需要用一个自定义的ClientDataTypeModelValidatorProvider替换现有的a。

如果你不喜欢你需要做的硬核编码,你也可以在你的视图模型中用一个字符串替换这个整数值,并在它上面有一个自定义的验证属性,它将执行解析并提供一个自定义的错误消息(甚至可以是本地化的)。

票数 39
EN

Stack Overflow用户

发布于 2011-10-12 01:09:39

作为一种替代方法,我应用了RegularExpression属性来捕获无效条目并在其中设置我的消息:

代码语言:javascript
复制
[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]

这是一个小技巧,但这似乎比其他解决方案提供的复杂性更可取,至少在我的特定情况下是这样。

编辑:这在MVC3中工作得很好,但是对于MVC4+来说似乎有更好的解决方案。

票数 23
EN

Stack Overflow用户

发布于 2011-06-20 05:47:18

我有一本关于MVC3的书。你所要做的就是:

代码语言:javascript
复制
public class ClientNumberValidatorProvider : ClientDataTypeModelValidatorProvider 
{ 
   public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, 
                                                          ControllerContext context) 
   { 
       bool isNumericField = base.GetValidators(metadata, context).Any(); 
       if (isNumericField) 
           yield return new ClientSideNumberValidator(metadata, context); 
   } 
} 

public class ClientSideNumberValidator : ModelValidator 
{ 
  public ClientSideNumberValidator(ModelMetadata metadata,  
      ControllerContext controllerContext) : base(metadata, controllerContext) { } 

  public override IEnumerable<ModelValidationResult> Validate(object container) 
  { 
     yield break; // Do nothing for server-side validation 
  } 

  public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
  { 
     yield return new ModelClientValidationRule { 
        ValidationType = "number", 
        ErrorMessage = string.Format(CultureInfo.CurrentCulture,  
                                     ValidationMessages.MustBeNumber,  
                                     Metadata.GetDisplayName()) 
        }; 
  } 
} 

protected void Application_Start() 
{ 
    // Leave the rest of this method unchanged 

    var existingProvider = ModelValidatorProviders.Providers 
        .Single(x => x is ClientDataTypeModelValidatorProvider); 
    ModelValidatorProviders.Providers.Remove(existingProvider); 
    ModelValidatorProviders.Providers.Add(new ClientNumberValidatorProvider()); 
} 

注意ErrorMessage是如何产生的,您指定当前区域性,并且从ValidationMessages(这里是区域性特定的).resx资源文件中提取本地化的消息。如果你不需要它,只需要用你自己的消息来代替它。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4828297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档