E 'perché il vostro è un QuoteQuantity
int
, che al momento non è Nullable
, in modo che quando si sta cercando di convalidare, il campo non può essere vuoto, perché non permette null
s.
2 modi per aggirare questo:
- impostare il proprio
QuoteQuantity
int come int?
(Nullable int
)
o
- utilizzare una proprietà diversa per accettare il valore come
string
e nel tuo get
per il QuoteQuantity
, usa un int.TryParse
per vedere se la stringa può essere convertita in un int
. Si avrebbe bisogno di un qualche tipo di controllo in atto, anche se per vedere se cade all'interno della vostra min Campo/max - se ne avete uno
Esempio:
primo suggerimento:
public int? QuoteQuantity { get; set; }
secondo suggerimento: (restituisce 0
, se la stringa è vuota/null o non valida int
)
public int QuoteQuantity
{
get
{
int qty = 0;
if (!string.IsNullOrWhiteSpace(QuoteQuantityAsString))
{
int.TryParse(QuoteQuantityAsString, out qty);
}
return qty;
}
}
public string QuoteQuantityAsString { get; set; }
// You will then need to use the
// QuoteQuantityAsString property in your View, instead
Vorrei suggerire la prima opzione, e assicurarsi di fare null
controlli intorno a dove si sta utilizzando il QuoteQuantity
:)
Spero che questo aiuti!
EDIT:
In tutta onestà di dare diverse opzioni, ho solo pensato ad un altro modo (probabilmente meglio di suggerimento 2). In entrambi i casi, penso che il suggerimento 1 sia ancora il modo migliore.
Al fine di restituire la convalida solo se l'utente fa ingresso qualcosa nella vostra "Citazione Quantità" input stringa sulla vista:
Vista:
Nel Visualizza, aggiungi un input di testo, che consente all'utente di inserire la quantità (o meno, come potrebbe essere il caso) e usarla al posto degli attuali elementi QuoteQuantity
Dategli un id
+ name
di qualcosa come quoteQty
Aggiungi un ValidationFor, come prima, ma dare il nome quoteQty
come primo argomento
Controller:
Nel tuo controller, il metodo POST
, accetta un altro parametro di string quoteQty
(in modo che questo si associ allo name
dalla tua vista). Questo otterrà popolato dal HttpPost
Prima vostro check (ModelState.IsValid)
, cercare di analizzare il quoteQty
come int
; in caso contrario, aggiungere un ModelError
per quoteQty
, con un messaggio
Quindi, il modello restituirà un errore di convalida e verrà visualizzato nella pagina desiderata.
Unico inconveniente è, questo non può essere convalidato sul lato client modo che il server dovrà restituire l'errore
Ti piace questa:
public ActionResult SendQuote(Model yourmodel,
string quoteQty)
{
if (!string.IsNullOrWhiteSpace(quoteQty))
{
if (!int.TryParse(quoteQty, out yourmodel.QuoteQuantity))
{
// If the TryParse fails and returns false
// Add a model error. Element name, then message.
ModelState.AddModelError("quoteQty",
"Whoops!");
}
}
...
// Then do your ModelState.IsValid check and other stuffs
}
E basta usare l'originale proprietà
public int QuoteQuantity { get; set; }
nel modello. Il valore predefinito di int
sarà 0
se non lo si è mai impostato. Se lo TryParse
ha esito negativo, imposta il valore su 0
, anche
È perché 'QuoteQuantity' è un' int' e non può essere nullo, quindi la convalida lo richiede ancora. Ho postato una risposta qui sotto :) –