web-dev-qa-db-fra.com

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. À cause de cela, je ne peux même pas réussir la validation côté client afin de créer une nouvelle balise dans la base de données .

51
frennky

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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
97
frennky

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 affichera "obligatoire" et le rendra obligatoire. Vous pouvez utiliser dojo-data-props = "required: false".

19
Curtis Yallop

la solution de Frennky a seulement supprimé data-val-required mais dans mon cas, j'avais toujours 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());
4
nthpixel

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 en tant que 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é.

3
Darin Dimitrov

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

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

ou utilisez Nullable.

espérons que ce code!

3
takepara

Avec MVC4, vous pouvez également utiliser ceci:

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

Définissez vos types de valeur de propriété Model ou View-Model comme "nullabel". Cela résoudra votre problème. Une chose importante qui supprime l'attribut "requis" de votre balise, sinon

Exemple:-

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

Ici, dans l'exemple, foo est un type entier nullable, cela ne sera plus nécessaire dans mvc.

J'espère que ceci vous aidera.

0
Jani Devang