2012-03-30 17 views
6

Ho una classe di modello "Paese" con la proprietà "CultureId" NON contrassegnata come richiesto. Un'altra classe "CountryViewModel" contiene la stessa proprietà "CultureId".ASP.NET MVC aggiunge la convalida per i campi non obbligatori

Durante il rendering della vista "Crea", ho notato che gli attributi dei dati di convalida sono stati aggiunti alla casella di testo "CultureId", sebbene non siano state aggiunte annotazioni di dati.

Sto usando

@Html.HiddenFor(mode => mode.CultureId) 

Quale potrebbe essere la causa di un tale comportamento?

Grazie

risposta

0

se è possibile utilizzare le annotazioni di dati, si dovrebbe verificare questa http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

namespace MvcApplication1.Models 
{ 
[MetadataType(typeof(MovieMetaData))] 
public partial class Movie 
{ 
} 


public class MovieMetaData 
{ 
    [Required] 
    public object Title { get; set; } 

    [Required] 
    [StringLength(5)] 
    public object Director { get; set; } 


    [DisplayName("Date Released")] 
    [Required] 
    public object DateReleased { get; set; } 
} 

}

che consente di configurare le convalide senza modelli sul lato database.

+0

Il suo problema non riguarda come impostare il fabbisogno in una proprietà, ma come evitare la convalida html indesiderata in cui è in esecuzione. Inoltre, il tuo modo di gestire l'attributo è tipico dei dati dinamici, non del modo in cui MVC di solito funziona – themarcuz

+0

ho pensato che avrebbe sovrascritto le regole di convalida, se la classe dei metadati sarà vuota –

12

Sto indovinando che il tuo CultureId è un int. MVC aggiunge automaticamente i tag richiesti a tipi di valori non annullabili.

Per disattivare questa funzione aggiungere

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

a Application_Start o rendere il vostro int nullable

+0

Già aggiunta e ancora lo stesso comportamento. Proverò a rendere l'int nullable. Grazie – Bill

+1

Buona risposta. Funziona per sbarazzarsi della convalida 'data-required', ma dato che l'Id è un' int' aggiunge il 'data-val-number' che ancora impedisce l'invio del modulo durante il tentativo di creare. Potrei aggirarlo impostando valori predefiniti come 0, ma non dovrei farlo. – eudaimos

+0

Il mio male - funziona come la convalida sembra saltare 'data-val-number' per gli ingressi nascosti – eudaimos

0

provare questo:

ModelState["CultureId"].Errors.Clear(); 

if (ModelState.IsValid)  
    { 
     ..... 
    } 

Se CultureId è int allora vi darà anche il risultato desiderato ...

+1

Questo è un po 'di kludge che evita il vero problema coinvolto qui. Vedi la [risposta di dskh per ulteriori informazioni] (http://stackoverflow.com/a/9941032/237838). –

8

Ci sono un paio di modi per manipolare e questo -
a). Rendere la proprietà come Nullable come

public int? Age { get; set; } 

b). Utilizzare il seguito nella classe controller -

ModelState["Age"].Errors.Clear(); 

c). Aggiungi all'avvio- DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Problemi correlati