Ho creato un attributo di convalida CompareLessThan personalizzato mediante la copia di ASP.NET MVC 3 CompareAttribute e, invece di verificare l'uguaglianza, controllo che una proprietà sia inferiore a un'altra. Se c'è un errore lato client, il messaggio '{0} deve essere inferiore a {1}' viene visualizzato all'utente.ASP.NET MVC ValidationAttribute Ottiene l'altro nome visualizzato di proprietà
Il mio modello è configurato come segue con gli attributi di visualizzazione che fanno riferimento a un file di risorse.
[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; }
Poi il metodo GetClientValidationRules di validazione è esattamente lo stesso come nel CompareAttribute
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
Qui stiamo generando il messaggio di errore che verrà visualizzato all'utente se c'è un problema. Posso ottenere il nome visualizzato dal file di risorse per la proprietà che è decorata con il mio attributo personalizzato CompareLessThan, ma la mia domanda è: come posso ottenere il nome visualizzato della proprietà "altra" con cui confrontiamo? Nel metodo IsValid abbiamo un riferimento al validationContext da cui posso generare un oggetto PropertyInfo per la proprietà 'other' e penso di ottenere il nome visualizzato. Ma nel GetClientValidationRules non ho accesso a quello.
Potrei sempre passare un altro valore per il nome visualizzato dell'altra proprietà, ma speravo che ci sarebbe stato un modo per derivarlo come sto già specificando con annotazioni di dati.
Qualche idea?
Buona idea, ma la collezione di proprietà è sempre vuota. –
@NickOlsen Questo è triste. Ho aggiornato la mia risposta con qualche "soluzione". – nemesv
Questo non funziona come la proprietà metadata.Model è solo il valore 0. Usando la tua logica sono stato in grado di capire un altro modo per farlo (vedi altra risposta) ma non mi piace molto. Spero che ci sia un modo migliore che qualcun altro può fornire. –