55 votes

La propriété non requise continue à obtenir l'attribut data-val-required

Voici le modèle avec sa validation:

 [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; }
    //...
}
 

Voici la vue:

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

Et voici ce qui est rendu:

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

Le problème est que la validation TagId est générée bien qu’aucun attribut Required ne soit défini sur la propriété TagId. Pour cette raison, je ne peux même pas passer la validation côté client afin de créer une nouvelle balise dans la base de données. Qu'est-ce que je rate?

103voto

frennky Points 5009

J'ai trouvé la réponse. Ajoutez simplement ceci à Application_Start :

 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
 

24voto

Curtis Yallop Points 639

Rendez les types de valeur du modèle de vue nullables. Ensuite, ils ne seront pas requis par défaut.

Notez également que si vous définissez l'attribut 'required = "false"' dans HTML 5 (si vous définissez HTML 5 dans vos métadonnées de doctype), il apparaîtra "obligatoire" et le rendra obligatoire. Vous pouvez utiliser dojo-data-props = "required: false".

7voto

nthpixel Points 460

La solution de Frennky a seulement retiré data-val-required mais dans mon cas, il me restait encore data-val-number et data-val

J'ai dû ajouter les deux lignes ci-dessous à Application_Start pour tout supprimer.

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

3voto

Darin Dimitrov Points 528142

Le problème est que la valeur du champ masqué est vide. Cela ne devrait pas arriver si vous utilisez un type entier. Je suppose que la propriété TagId est définie comme un type nullable dans la classe Tag . Donc, attribuez-lui une valeur avant de rendre la vue ou utilisez un type entier:

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

de sorte que le champ masqué généré ressemble à ceci:

 <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" 
/>
 

De plus, normalement, la validation côté client ne doit pas être déclenchée pour ce champ caché.

3voto

takepara Points 5965

jQuery valide l'attribut HTML "désactivé".

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

ou utilisez Nullable.

espérons que ce code!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X