La propriété Unrequired obtient l'attribut data-val-required

C'est 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 que get 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>

le problème est que la validation TagId est générée alors que thare n'est pas un attribut requis 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 étiquette dans la base de données. Ce qui me manque?

50
demandé sur frennky 2011-01-15 17:45:03

7 réponses

j'ai trouvé la réponse. Il suffit d'ajouter ceci à Application_Start :

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
96
répondu frennky 2011-01-30 21:51:28

rend les types view-model nullables. Alors ils ne seront pas requis par défaut.

Notez aussi que si vous mettez l'attribut 'required="false"' dans html 5 (Si vous mettez html 5 dans vos métadonnées doctype), il verra "required" et le rendra nécessaire. Vous pouvez utiliser dojo-données-props="requis:false".

18
répondu Curtis Yallop 2012-08-22 01:00:54

la solution de frennky a seulement enlevé data-val-required mais dans mon cas j'avais encore data-val-number et data-val

j'ai dû ajouter les deux lignes ci-dessous à Application_Start pour me débarrasser de tout.

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
4
répondu nthpixel 2012-11-15 02:29:28

Le problème est que la valeur du champ caché est vide. Cela ne devrait pas se produire si vous utilisez le type entier. Je suppose que la propriété TagId est définie comme un type nullable dans la classe Tag . Ainsi soit lui attribuer une valeur avant de rendre la vue ou utiliser un type entier:

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

pour que le champ caché 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" 
/>

normalement la validation côté client ne devrait pas être déclenchée pour cela champ caché.

3
répondu Darin Dimitrov 2011-01-15 15:02:06

jquery valider cible cheque "désactivé" attribut html.

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

ou à utiliser nul.

espérons ce code!

3
répondu takepara 2011-02-18 09:08:58

avec MVC4 vous pouvez aussi utiliser ceci:

@{ Html.EnableClientValidation(false); }
@Html.EditorForModel()
@{ Html.EnableClientValidation(true); }
2
répondu t2t 2017-01-07 11:39:03

Faire de votre Modèle ou de la Vue-Modèle de la propriété des types de valeur "nullabel". Cela permettra de résoudre votre problème.Une chose importante qui supprime l'attribut "required" de votre étiquette sinon il prendra i" required "

exemple: -

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

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

espérons que cela vous aidera.

0
répondu Jani Devang 2017-09-07 05:33:06