2011-09-05 6 views
18

Ho un dropdownlistfor nel file di cshtml:dropdownlistfor MVC non è contrassegnato come richiesto, ma è ancora necessario

var kategorie_wlasna = new SelectList(
    (from z in Model.Kategoria 
    where !formReadOnly || z.Id == Model.KategoriaWlasnaId 
     select z), 
    "Id", 
    "Nazwa"); 
... 
@Html.DropDownListFor(
    model => model.KategoriaWlasnaId, 
    kategorie_wlasna, 
    "----", 
    htmlClassDropDownListDef) 

Nel mio ViewModel ho la proprietà senza alcun annotazioni come richiesto:

public long KategoriaWlasnaId { get; set; } 

Ma il campo è ancora Richiesto. Nel browser ricevo:

<select class="input-validation-error form_object1" data-val="true" data-val-number="The field KategoriaWlasnaId must be a number." data-val-required="The KategoriaWlasnaId field is required." id="KategoriaWlasnaId" name="KategoriaWlasnaId"> 
    <option value="">-----</option> 
    <option value="1227">Wykroczenie</option> 
    <option value="1228">Przestępstwo</option> 
</select> 

Cosa mi manca?

risposta

37

È normale. I tipi di valore sono sempre richiesti. Si potrebbe rendere il vostro annullabile immobile:

public long? KategoriaWlasnaId { get; set; } 

Ora non sarà più necessario e se l'utente non seleziona alcun elemento nel menu a discesa il suo valore sarà null. E se si voleva rendere più richiesto e personalizzare il messaggio si può decorare con l'attributo richiesto:

[Required] 
public long? KategoriaWlasnaId { get; set; } 
+0

Thank you very partita. Ho completamente perso una soluzione così banale. – blackik

+0

Grazie. È perfettamente logico che i tipi di valore debbano essere "automaticamente richiesti", ma sono anche riuscito a rientrare in questo problema. – Moshe

4

È possibile modificare il valore predefinito DataAnnotationsModelValidatorProvider in modo che i tipi di valore non saranno tenuti aggiungendo le seguenti righe Global.asax.cs in il metodo Application:

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelMetadataValidatorProvider()); 
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
0

Se il tipo di dati (uso a lungo) non è un must, allora questo funziona anche semplicemente cambiando lunga stringa

lungo KategoriaWlasnaId pubblico {get; impostato; }

stringa pubblica KategoriaWlasnaId {get; impostato; }

questo anche

pubblico lungo? KategoriaWlasnaId {get; impostato; }

anche se si utilizza le annotazioni di dati che si possono può usare l'attributo Nullable così