假设此模型:
Public Class Detail
...
<DisplayName("Custom DisplayName")>
<Required(ErrorMessage:="Custom ErrorMessage")>
Public Property PercentChange As Integer
...
end class
视图:
@Html.TextBoxFor(Function(m) m.PercentChange)
将继续执行此html:
<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
的错误消息,就像服务器端的其他错误消息一样。
发布于 2011-01-29 02:27:33
这不是件容易的事。默认消息作为嵌入资源存储到System.Web.Mvc
程序集中,正在获取的方法是内部密封内部类(System.Web.Mvc.ClientDataTypeModelValidatorProvider+NumericModelValidator.MakeErrorString
)的私有静态方法。这就像是微软编码的家伙隐藏了一个最高机密:-)
您可以查看下面的blog post,它描述了一种可能的解决方案。您基本上需要用一个自定义的ClientDataTypeModelValidatorProvider替换现有的a。
如果你不喜欢你需要做的硬核编码,你也可以在你的视图模型中用一个字符串替换这个整数值,并在它上面有一个自定义的验证属性,它将执行解析并提供一个自定义的错误消息(甚至可以是本地化的)。
发布于 2011-10-12 01:09:39
作为一种替代方法,我应用了RegularExpression属性来捕获无效条目并在其中设置我的消息:
[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]
这是一个小技巧,但这似乎比其他解决方案提供的复杂性更可取,至少在我的特定情况下是这样。
编辑:这在MVC3中工作得很好,但是对于MVC4+来说似乎有更好的解决方案。
发布于 2011-06-20 05:47:18
我有一本关于MVC3的书。你所要做的就是:
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资源文件中提取本地化的消息。如果你不需要它,只需要用你自己的消息来代替它。
https://stackoverflow.com/questions/4828297
复制相似问题