[英]How to change the default ErrorMessage for StringLength attribute in view model with unobtrusive validation
對於我的目的,默認的StringLength驗證錯誤消息太長,因此我想使其更短。
我知道我可以為每個屬性指定ErrorMessage,但我寧願不在各處重復此操作:
[StringLength(25, ErrorMessage = "Max length is {1}")]
[DisplayName("Address")]
public virtual string BillAddress1 { get; set; }
基於這篇文章, 為StringLength驗證修改Default ErrorMessage ,我將StringLengthAttribute子類化:
public class CustomStringLengthAttribute : StringLengthAttribute
{
public CustomStringLengthAttribute()
: this(20)
{
}
public CustomStringLengthAttribute(int maximumLength)
: base(maximumLength)
{
base.ErrorMessage = "Max length is {1}";
}
}
並改為使用CustomStringLengthAttribute:
[CustomStringLength(25)]
[DisplayName("Address")]
public virtual string BillAddress1 { get; set; }
這樣編譯就可以了,我在CustomStringLengthAttribute構造函數中設置了一個斷點來驗證它是否被命中,但是不打擾的驗證不再起作用-無效的數據被發送回控制器。
當我不使用我的子類版本時,它工作正常。
另外,這是JavaScript驗證:
if (validation.validateForm($('#addressForm'))) {
....
}
validateForm:
function validateForm(form) {
prepareValidationScripts(form);
var validator = $.data(form[0], 'validator');
return validator.form();
}
function prepareValidationScripts(form) {
if (form.executed)
return;
form.removeData("validator");
$.validator.unobtrusive.parse(document);
form.executed = true;
}
我想念什么?
謝謝。
嘗試使用自定義驗證。
CustomStringLengthAttribute.cs
public class CustomStringLengthAttribute : ValidationAttribute, IClientValidatable
{
public int MaximumLength
{
get;
private set;
}
public int MinimumLength
{
get;
set;
}
public CustomStringLengthAttribute(int maximumLength)
: base(new Func<string>(CustomStringLengthAttribute.GetDefaultErrorMessage))
{
this.MaximumLength = maximumLength;
}
private static string GetDefaultErrorMessage()
{
return "Max length {1}";
}
public override string FormatErrorMessage(string name)
{
return string.Format(base.ErrorMessageString, name, this.MaximumLength, this.MinimumLength);
}
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
string text = (string)value;
int maximumLength = this.MaximumLength;
int minimumLength = this.MinimumLength;
if (maximumLength < 0)
{
throw new InvalidOperationException("The maximum length must be a nonnegative integer.");
}
if (minimumLength > maximumLength)
{
throw new InvalidOperationException(string.Format("The maximum value '{0}' must be greater than or equal to the minimum value '{1}'.", maximumLength, minimumLength));
}
int length = text.Length;
return length <= maximumLength && length >= minimumLength;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationParameters.Add("max", MaximumLength);
rule.ValidationParameters.Add("min", MinimumLength);
rule.ValidationType = "customstringlength";
yield return rule;
}
}
在js文件中:
/// <reference path="jquery-1.4.4.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
if ($.validator && $.validator.unobtrusive) {
$.validator.unobtrusive.adapters.addMinMax("customstringlength", "min","max");
$.validator.addMethod("customstringlength", function (value, element, min,max) {
if (value) {
if (value.length<min || value.length>max) {
return false;
}
}
return true;
});
}
型號類別:
[CustomStringLength(25)]
[DisplayName("Address")]
public virtual string BillAddress1 { get; set; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.