ASP.NET MVC 4 - La validation côté client ne fonctionne pas
Je suis à l'aide de Visual Studio 2012 et je ne peux pas obtenir un attribut personnalisé côté client logique de travail
pour reproduire à une échelle plus petite, j'ai créé un nouveau MVC 4 projet que j'ai créé le modèle suivant et l'Attribut qui ne sera jamais à valider
public class MyModel
{
public int Id { get; set; }
[Required]
public string LastName { get; set; }
[NeverValid(ErrorMessage="Serverside Will Never Validate")]
public string FirstName { get; set; }
}
public class NeverValidAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return false;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName });
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "nevervalid"
};
}
}
J'ai ensuite les actions suivantes ajouté à la HomeController
public ActionResult Index()
{
return View(new MyModel());
}
[HttpPost]
public ActionResult Index(MyModel model)
{
if (!ModelState.IsValid)
{
//Will Always Be Invalid
}
return View(model);
}
Il y a aussi un fichier javascript appelé nevervalid.js
$(function () {
$.validator.addMethod("nevervalid", function () {
return false;
}, "Clientside Should Not Postback");
$.validator.unobtrusive.adapters.addBool("nevervalid");
});
et la Vue Index
@model CustomAttribute.Models.MyModel
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>MyModel</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/Scripts/nevervalid.js")
}
Les domaines pertinents dans mon web.config ressembler à ceci
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
lorsque le chargement de la page, les fichiers suivants sont chargés (got ce à partir du réseau, onglet de google chrome F12)
http://localhost:7440/
http://localhost:7440/Content/site.css
http://localhost:7440/Scripts/modernizr-2.5.3.js
http://localhost:7440/Scripts/jquery-1.7.1.js
http://localhost:7440/Scripts/jquery.unobtrusive-ajax.js
http://localhost:7440/Scripts/jquery.validate.js
http://localhost:7440/Scripts/jquery.validate.unobtrusive.js
http://localhost:7440/Scripts/nevervalid.js
et mon attribut personnalisé ajoute pertinents à la recherche de données - des trucs à la première entrée du nom comme si...
<input class="text-box single-line valid" data-val="true" data-val-nevervalid="Serverside Will Never Validate" id="FirstName" name="FirstName" type="text" value="">
donc, je vous le demande, pourquoi, oh pourquoi cette chose à la publication de le faire serverside de validation alors que j'ai quelques parfaitement à la recherche de code javascript ici? dois-je sacrifier un animal sur une nuit sans lune, au sommet d'une colline quelque part?
source d'informationauteur G2Mula
Vous devez vous connecter pour publier un commentaire.
Je me demandais ce qui se passerait si vous avez altéré nevervalid.js pour que le code s'exécute avant que le document est prêt.
Ma pensée de base est que la discrète validation des travaux par l'analyse du document lorsque le dom est prêt... mais si vous êtes en train de charger votre validation personnalisée de choses à la fois /par la suite, il ne va pas savoir quoi faire quand il vient en face de vous personnalisé de validation des données d'attribut.
De toute façon, essayez de changer nevervalid.js à être tout simplement: