2016-05-10 25 views
5

ho avuto un attributo [Required] in una delle proprietà di mio punto di vista del modello:messaggio di convalida "Required" rimane dopo la rimozione di [Required] attribuire MVC 5

[DefaultValue(1)] 
[Required(ErrorMessage = "* Required")] // this has now been removed 
public int QuoteQuantity { get; set; } 

ho rimosso il [Required], ma ho ancora ottenere questo messaggio di convalida che mi impedisce di presentare.

Dal punto di vista devo queste righe:

@Html.EditorFor(model => model.QuoteQuantity, new { htmlAttributes = new { @class = "form-control", value = "1" } }) 
@Html.ValidationMessageFor(model => model.QuoteQuantity, "", new { @class = "text-danger" }) 

Quando lascio questo vuoto e inviare ottengo questo errore di convalida:

The QuoteQuantity field is required.

Devo dire che io ho costruito la soluzione più volte, chiuso e riaperto VS, e continuo a ricevere questo errore di convalida anche se il codice corrente è questo:

[DefaultValue(1)] 
public int QuoteQuantity { get; set; } 

Qualche idea sul perché questo potrebbe accadere?

+0

È perché 'QuoteQuantity' è un' int' e non può essere nullo, quindi la convalida lo richiede ancora. Ho postato una risposta qui sotto :) –

risposta

7

E 'perché il vostro è un QuoteQuantityint, 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

Problemi correlati