(Asp.Net MVC3) Как определить StringLength для ASCII и Unicode? - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть следующие определения в модели

        [Required]
        [StringLength(100, MinimumLength = 10)]
        [DataType(DataType.Text)]
        [Display(Name = "XXX")]
        public string XXX{ get; set; }

Теперь я хочу, чтобы он обрабатывал ввод ACSII и Unicode по-разному, для ASCII каждый символ учитывает длину 1, поэтому требуется минимальная длина 10 и максимальная длина 50. Но для символа Unicode я хочу рассмотреть его длину 2, поэтому 5 Unicode chars достаточно для минимального требования.

Как мне это сделать?

Полагаю, мне могут понадобиться два подхода: сначала переписать проверку длины в asp.net, затем мне нужно перезаписать проверку длины в jquery. Не так ли?

У кого-нибудь есть рабочий образец, спасибо.

1 Ответ

0 голосов
/ 22 ноября 2011

Чтобы делать то, что вы хотите, вы должны иметь возможность ввести собственный атрибут проверки:

class FooAttribute : ValidationAttribute
{
    private readonly int minLength, maxLength;
    public FooAttribute(int minLength, int maxLength) : this(minLength, maxLength, "Invalid ASCII/unicode string-length") {}
    public FooAttribute(int minLength, int maxLength, string errorMessage) : base(errorMessage)
    {
        this.minLength = minLength;
        this.maxLength = maxLength;
    }

    protected override ValidationResult IsValid(object value, ValidationContext ctx)
    {
        if(value == null) return ValidationResult.Success;
        var s = value as string;
        if(s == null) return new ValidationResult("Not a string");

        bool hasNonAscii = s.Any(c => c >= 128);

        int effectiveLength = hasNonAscii ? (2*s.Length) : s.Length;

        if(effectiveLength < minLength || effectiveLength > maxLength) return new ValidationResult(FormatErrorMessage(ctx.DisplayName));
        return ValidationResult.Success;
    }
}
...