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 .
J'ai trouvé la réponse. Ajoutez simplement ceci à Application_Start
:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
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".
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());
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é.
jQuery valide l'attribut HTML "désactivé".
$(function () {
$("#TagId").attr("disabled", "disabled")
});
ou utilisez Nullable.
espérons que ce code!
Avec MVC4, vous pouvez également utiliser ceci:
@{ Html.EnableClientValidation(false); }
@Html.EditorForModel()
@{ Html.EnableClientValidation(true); }
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.