Ho un modulo di registrazione e l'utente deve inserire la metratura della propria casa. Vorrei che questo valore fosse solo un numero intero. C'è un modo per convalidare questo valore usando gli attributi asp.net mvc?Come eseguire la convalida del modello intero in asp.net mvc 2
risposta
sì, lo è, ma sarà necessario creare una versione piatta dell'oggetto che si desidera creare, poiché la convalida con gli attributi viene eseguita solo dopo che MVC ha convertito i dati nel modello. che, quando il tuo valore è un int, non riuscirà a convalidare se l'utente non ha inserito un int, e riceverai un messaggio di errore MVC invece del tuo messaggio errato.
puoi pubblicare l'oggetto che desideri realizzare?
con una versione piatta intendo che tutti i tempi e gli interi sono punture nella versione piatta.
allora io uso questo:
[DisplayName("Square meters")]
[PosNumberNoZero(ErrorMessage = "need a positive number, bigger than 0")]
public string squaremeters { get; set; }
nello stesso file
public class PosNumberNoZeroAttribute : ValidationAttribute {
public override bool IsValid(object value) {
if (value == null) {
return true;
}
int getal;
if (int.TryParse(value.ToString(), out getal)) {
if (getal == 0)
return false;
if (getal > 0)
return true;
}
return false;
}
}
se il mio ModelState sia giusto, allora, io uso automapper di convertire il mio FlatModel nel mio modello, che è a soli 2 linee di codice.
edit: se 0 è un numero valido:
public class PosNumberAttribute : ValidationAttribute {
public override bool IsValid(object value) {
if (value == null) {
return true;
}
int getal;
if (int.TryParse(value.ToString(), out getal)) {
if (getal >= 0)
return true;
}
return false;
}
}
rendo conto che questo è già stato risposto, ma la risposta Stefanvds' è uneccessarily complicato. Basta usare MVC costruito nel convalida attributi:
[DisplayName("Square Feet")]
[Required(ErrorMessage = "Square Feet is Required")]
[Range(0, int.MaxValue, ErrorMessage = "Square Feet must be a positive number")]
public int SquareFeet { get; set; }
Per Range, il sistema ha un ErrorMessage "Il campo XXX deve essere compreso tra XXX e XXX." Quindi ErrorMessage è opzionale –
Sì, sei corretto. Ma CustomMessage personalizzato è molto più user friendly di: "Il campo Square Feet deve essere compreso tra 0 e 2147483647". ;) –
Almeno in MVC2 questo non funziona se i dati passati non sono un numero intero valido.Il framework passerà nel valore predefinito che è 0 e la convalida avrà esito positivo, ma successivamente fallirà quando il framework andrà a istanziare realmente il modello e vedrà che non può convertire i dati in un numero intero. Alza il messaggio di errore predefinito in quel punto. –
io di solito uso l'attributo gamma come questo:
positivo int:
[Range(0,int.MaxValue)]
public int Id { get; set; }
Negativo int:
[Range(int.MinValue,0)]
public int Id { get; set; }
Qualsiasi int :
[Range(int.MinValue,int.MaxValue)]
public int Id { get; set; }
L'utilizzo di Range
per un campo int
non funziona se si dispone di lettere come "a".
L'errore Handler
non viene chiamato (ASP.NET CORE 1.0 RC2).
molto più facile usare una regex qui: http://stackoverflow.com/questions/5661569/regular-expression-to-match-numbers-only-not-starting-with-zero – GP24