2011-01-15 1 views
49

Questo è il modello con la sua convalida:immobili non necessari mantiene sempre data-val-required attributo

[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:

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Tag</legend> 

     <div>@Html.EditorForModel()</div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Ed ecco ciò che di ottenere renderd:

<form action="/Tag/Create" method="post"> 
    <fieldset> 
     <legend>Tag</legend> 
     <div><input data-val="true" data-val-number="The field TagId must be a number." data-val-required="The TagId field is required." id="TagId" name="TagId" type="hidden" value="" /> 

     <div class="editor-label"><label for="Name">Name</label></div> 
     <div class="editor-field"><input class="text-box single-line" data-val="true" data-val-length="The field Name must be a string with a maximum length of 20." data-val-length-max="20" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span></div>    
    ... 
    </fieldset> 
</form> 

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?

risposta

93

Ho trovato la risposta. Basta aggiungere questo per Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

Salvato la mia giornata !!! – kheya

+0

Grazie. Ho salvato anche la mia giornata. Secondo me questo è un comportamento al contrario. False dovrebbe essere l'impostazione predefinita. – Anish

+1

@frnnky Ho aggiunto questo, ma non ha risolto [collegamento] (http://stackoverflow.com/questions/14452344/remove-required-property) My symph. per favore aiutatemi. Grazie – Amol

3

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 classe Tag. Quindi, o assegnare un valore prima del rendering della vista o utilizzare 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 è simile al seguente:

<input 
    data-val="true" 
    data-val-number="The field TagId must be a number." 
    data-val-required="The TagId field is required." 
    id="TagId" 
    name="TagId" 
    type="hidden" 
    value="0" 
/> 

anche normalmente validazione lato client non deve essere attivato per questo campo nascosto.

+0

Primo, TagId non è annullabile, è solo int. In secondo luogo, markup è generato da html helper EditorForModel quindi non ho il controllo su di esso. Per impostare il valore su 0, suppongo di poter inviare un'istanza vuota di Tag alla pagina Crea, ma questa non è la soluzione che sto cercando. – frennky

3

jquery obiettivo validate cheking attributo "disabile" html.

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

oppure utilizzare Nullable.

spero che questo codice!

16

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

Nota anche se si inserisce l'attributo 'required = "false"' in html 5 (se si imposta html 5 nei propri metadati doctype), verrà visualizzato "required" e reso obbligatorio. Puoi usare dojo-data-props = "required: false". soluzione

+2

Perché il downvote? Rendere la proprietà nullable è un modo valido per affrontare questo problema senza dover apportare modifiche a livello di sistema in Application_Start. – StuartQ

+1

@StuartQ Sono d'accordo con te quindi ho votato per rimuovere il voto negativo. Rendere la proprietà nullable è un modo valido per affrontare questo problema. Ha funzionato per me. –

+0

Sicuramente la risposta migliore! Preferirei non apportare modifiche a livello di sistema per affrontare un problema in una vista. Cheers – Johny

4

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

ho dovuto aggiungere le due linee qui sotto per Application_Start per sbarazzarsi di tutto.

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

Mi chiedo quali effetti collaterali questo codice potrebbe avere? – nuander

+1

@nuander preoccupazione valida. È come usare una mazza per rompere un dado. – Stijn

+0

ha ottenuto una risposta più semplice che ha funzionato per me qui http://stackoverflow.com/questions/14452344/mvc3-removed-required-but-keeps-getting-data-val-required-attribute – TechnicalSmile

1

Con MVC4 è anche possibile utilizzare questo:

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

Fai il tuo modello o proprietà View-Modello di valore tipi "nullabel". Questo risolverà il tuo problema.Una cosa importante che rimuovere l'attributo "required" dal tuo tag altrimenti ci vorranno i "necessaria"

Esempio: -

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

Qui nell'esempio foo è di tipo nullable intero, questo non è più sarà richiesto in mvc .

Spero che questo ti possa aiutare.