2012-11-08 20 views
28

Ho questo campo che per qualche motivo quando clicco su invio, riceve un messaggio di conferma che il campo è richiesto.ASP.NET MVC campo opzionale trattato come richiesto

[DisplayName("Total Budget:")] 
public double Budget { get; set; } 

@Html.EditorFor(model => model.account.Budget) 
@Html.ValidationMessageFor(model => model.account.Budget) 

public class Account 
{ 
    [DisplayName("Total Budget:")] 
    public double Budget { get; set; } //dropdown 
} 
+0

Che aspetto ha il tuo markup. –

+0

@AntarrByrd ha aggiornato l'OP – user1662812

+0

che aspetto ha l'account? – dove

risposta

64

Il built-in DefaultModelBinder in MVC si esibiranno richiesta e convalida del tipo di dati su tipi di valore come int, DateTime, decimal, ecc. Ciò accadrà anche se non specifichi esplicitamente la convalida usando qualcosa come [Required].

Al fine di rendere questa opzione, si dovrà definire come annullabile:

public double? Budget { get; set; } 
+1

Per espandere se hai usato il doppio? tutto andrebbe bene. Ma il doppio richiederà un valore. (aggiunto prima della modifica di Jerad). – Maess

+2

Grazie, grazie, grazie – Ashby

+0

Grazie mille, risparmi questo giorno !!! –

1

Probabilmente modificare il budget da un double-double?

Probabilmente si può provare ad aggiungere questo attributo al controller

BindExclude([Bind(Exclude="Budget")]) così

5

double è un tipo di valore. I tipi di valore contengono sempre un valore, anche se non ne hai impostato uno. Quel valore è il valore predefinito per il suo tipo (in questo caso 0.0). Tutti i tipi di valore sono trattati come richiesto dal framework. L'unico modo è creare un modello personalizzato, ma questo non impedirà al modello di contenere il valore predefinito (perché non c'è modo di dire che non è stato inserito).

Quindi, anche se si crea un raccoglitore personalizzato, quando si elabora il modello, non sarà possibile stabilire se qualcuno ha inserito 0 o se si è trattato solo del valore predefinito.

Pertanto, l'unica soluzione reale consiste nel modificare il modello di visualizzazione per utilizzare un tipo nullable, ad esempio Nullable<double> (stenografia è double?).

+2

Fastidioso quando si dispone di una proprietà che si desidera avere l'impostazione predefinita se non è stata specificata. Voglio che la mia proprietà sia 0, non null, se è stata lasciata vuota, ma MVC ha automaticamente fallito la convalida dicendo che era richiesta. – xr280xr

2

si deve aggiungere la seguente riga nel Application_Start (global.asax)

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Fonte: Unrequired property keeps getting data-val-required attribute

+0

Benvenuti nello stack overflow!La tua risposta fornisce una soluzione alternativa ed è perfettamente valida. Tuttavia, in generale, è consigliabile fornire maggiori dettagli a riguardo nella risposta. Ad esempio, si dovrebbe notare che questa linea di configurazione influenzerebbe tutte le entità nell'applicazione. Sei libero di modificare la tua risposta per aggiungere ulteriori dettagli. – infiniteRefactor

0

Usa [notmapped] annotazione, questo elimina la convalida richiesta nel flusso si usa anche propri attributi di visualizzazione

0

Utilizzare Nullable o ? dopo il nome dell'attributo.

Problemi correlati