Utworzono niestandardowy atrybut sprawdzania poprawności CompareLessThan, kopiując atrybut porównania atrybutu ASP.NET MVC 3 i zamiast sprawdzać równość, sprawdzam, czy jedna właściwość jest mniejsza od innej. Jeśli występuje błąd po stronie klienta, komunikat "{0} musi być mniejszy niż {1}" jest wyświetlany użytkownikowi.ASP.NET MVC ValidationAttribute Pobierz inną nazwę wyświetlaną właściwości
Mój model został skonfigurowany w następujący sposób z atrybutami wyświetlania odnoszącymi się do pliku zasobów.
[CompareLessThan("AmountAvailable", ErrorMessageResourceName="CompareLessThan", ErrorMessageResourceType = typeof(Resources.ValidationMessages))]
[Display(Name = "Amount", ResourceType = typeof(Resources.Labels))]
public decimal Amount { get; set; }
[Display(Name = "AmountAvailable", ResourceType = typeof(Resources.Labels))]
public decimal AmountAvailable { get; set; }
Następnie niestandardowy sposób GetClientValidationRules walidacji jest dokładnie taka sama jak w CompareAttribute
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
Tu generują komunikat o błędzie, który będzie wyświetlany użytkownikowi, jeśli nie jest to problem. Mogę pobrać nazwę wyświetlaną z pliku zasobów dla właściwości, która jest ozdobiona moim niestandardowym atrybutem CompareLessThan, ale moje pytanie brzmi: jak mam zamiar uzyskać nazwę wyświetlaną "innej" właściwości, z którą porównujemy? W metodzie IsValid mamy odwołanie do validationContext, z którego mogę wygenerować obiekt PropertyInfo dla właściwości "other" i myślę, że otrzymam nazwę wyświetlaną. Ale w GetClientValidationRules nie mam do tego dostępu.
Zawsze mogłem po prostu przekazać inną wartość dla wyświetlanej nazwy innej własności, ale miałem nadzieję, że istnieje sposób na jej wyprowadzenie, ponieważ już określam ją adnotacjami danych.
Wszelkie pomysły?
Dobra myśl, ale kolekcja Właściwości jest zawsze pusta. –
@NickOlsen To jest smutne. Zaktualizowałem swoją odpowiedź za pomocą pewnego "obejścia". – nemesv
To nie działa tak jak metadane. Właściwość Model jest tylko wartością 0. Za pomocą twojej logiki udało mi się wymyślić inny sposób, aby to zrobić (patrz inna odpowiedź), ale tak naprawdę to nie lubię. Mam nadzieję, że istnieje lepszy sposób, który może zapewnić ktoś inny. –