La proprietà non richiesta continua a ricevere l’attributo data-val-required

Questo è il modello con la sua validazione:

[MetadataType(typeof(TagValidation))] public partial class Tag { } public class TagValidation { [Editable(false)] [HiddenInput(DisplayValue = false)] public int TagId { get; set; } [Required] [StringLength(20)] [DataType(DataType.Text)] public string Name { get; set; } //... } 

Ecco la vista:

  

Create

@using (Html.BeginForm()) { @Html.ValidationSummary(true)
Tag
@Html.EditorForModel()

}
@Html.ActionLink("Back to List", "Index")

Ed ecco cosa viene reso:

 
Tag
...

Il problema è che la convalida TagId viene generata anche se thare non è un attributo obbligatorio impostato sulla proprietà TagId. Per questo motivo non posso nemmeno passare la validazione lato client per creare un nuovo Tag in db. Cosa mi manca?

Ho trovato la risposta. Basta aggiungere questo a Application_Start :

 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Rende nullable i tipi di valori del modello di visualizzazione. Quindi non saranno richiesti per impostazione predefinita.

Nota anche se inserisci l’attributo ‘required = “false”‘ in html 5 (se imposti html 5 nei tuoi meta dati doctype), vedrà “required” e lo renderà necessario. Puoi usare dojo-data-props = “required: false”.

La soluzione di frennky ha solo rimosso data-val-required ma nel mio caso avevo ancora data-val-number e data-val

Ho dovuto aggiungere le due linee in basso a Application_Start per sbarazzarmi di tutto.

 ModelValidatorProviders.Providers.Clear(); ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider()); 

Il problema è che il valore del campo nascosto è vuoto. Questo non dovrebbe accadere se si usa un tipo intero. Suppongo che la proprietà TagId sia definita come un tipo nullable nella class Tag . Quindi, assegnagli un valore prima di visualizzare la vista o usa un tipo intero:

 [MetadataType(typeof(TagValidation))] public partial class Tag { public int TagId { get; set; } public string Name { get; set; } } 

in modo che il campo nascosto generato assomigli a questo:

  

Inoltre normalmente la validazione lato client non deve essere triggersta per questo campo nascosto.

jquery convalida l’attributo html “disabilitato” target cheking.

 $(function () { $("#TagId").attr("disabled", "disabled") }); 

o usa Nullable.

spero che questo codice!

Con MVC4 puoi anche usare questo:

 @{ Html.EnableClientValidation(false); } @Html.EditorForModel() @{ Html.EnableClientValidation(true); } 

Rendi il valore del modello o del modello View-type “nullabel”. Questo risolverà il tuo problema. Una cosa importante che rimuove l’attributo “richiesto” dal tuo tag altrimenti ci vorrà “richiesto”

Esempio:-

 public class ViewModle { public int? foo{get;set;} } 

Qui nell’esempio foo è il tipo nullable integer, che non sarà più richiesto in mvc.

Spero che questo ti possa aiutare.