2010-05-26 12 views
14

Ho un'annotazione [Range] che assomiglia a questo:Annotazione intervallo tra nulla e 100?

[Range(0, 100)] 
public int AvailabilityGoal { get; set; } 

mia pagina web si presenta così:

<%=Html.TextBoxFor(u => u.Group.AvailabilityGoal)%> 

Esso funziona come dovrebbe, posso inserire solo valori compresi tra 0 e 100, ma Voglio anche che la casella di input sia facoltativa, l'utente non dovrebbe ottenere un errore di convalida se la casella di input è vuota. Questo non ha nulla a che fare con l'intervallo ma perché il tipo è un numero intero. Se l'utente lo lascia vuoto dovrebbe rendere AvailabilityGoal = 0 ma non voglio forzare l'utente a inserire uno zero.

Ho provato questo ma (ovviamente) non ha funzionato:

[Range(typeof(int?), null, "100")] 

E 'possibile risolvere questo problema con annotazioni dati o in qualche altro modo?

Grazie in anticipo.

Bobby

+0

newbie su annotazioni - che dire di non zero? > 0 o <0 ma non zero – codeputer

risposta

22

Non dovrebbe essere necessario modificare l'attributo [Range], come [Range] e altri built-in DataAnnotations validatori no-op quando somministrato un valore vuoto. Basta rendere la proprietà stessa di tipo int? anziché int. Le proprietà ValueType non annullabili (come int) sono sempre automaticamente richieste.

+0

Questo ha funzionato come volevo, più facile di quanto pensassi. Grazie. – Bobby

5

credo che si possa ignorare l'oggetto Range e aggiungere questo comportamento.

public class OptionalRange : RangeAttribute { 
    public override bool IsValid(object value) { 
     if (value == null || (int)value == 0) return true; 
     return base.IsValid(value); 
    } 
} 
+0

Se si utilizza la convalida Intervallo su un valore nullable int che NON è contrassegnato come richiesto, continuerà a fallire la convalida nel browser quando non si immette un valore. Sovrascrivere l'attributo come menzionato sopra non modifica questo comportamento. Sto testando questo con MVC 5.2.3 su un modulo Razor. – jrichview

Problemi correlati