Ich benutze Visual Studio 2012 und ich kann nicht ein benutzerdefiniertes Attribut clientseitige Logik zu arbeiten, um in einem kleineren Maßstab zu reproduzieren, erstellte ich ein neues MVC 4-Projekt, das ich folgende erstellt Modell und Attribute, die nieASP.NET MVC 4 - Clientseitige Validierung funktioniert nicht
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"
};
}
}
ich dann die folgenden Aktionen hinzugefügt, um die Homecontroller
public ActionResult Index()
{
return View(new MyModel());
}
[HttpPost]
public ActionResult Index(MyModel model)
{
if (!ModelState.IsValid)
{
// Will Always Be Invalid
}
return View(model);
}
Es gibt auch eine JavaScript-Datei namens nevervalid.js
validieren$(function() {
$.validator.addMethod("nevervalid", function() {
return false;
}, "Clientside Should Not Postback");
$.validator.unobtrusive.adapters.addBool("nevervalid");
});
und der Index-Ansicht
@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")
}
Die relevanten Bereiche in meinem web.config wie folgt aussehen
<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>
, wenn die Seite geladen wird, werden die folgenden Dateien geladen (das von Netzwerk Registerkarte bekam unter Chrom 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
und meine benutzerdefinierte Attribut hinzugefügt relevant Daten- Sachen Vornamens Eingabe suchen, wie so ...
<input class="text-box single-line valid" data-val="true" data-val-nevervalid="Serverside Will Never Validate" id="FirstName" name="FirstName" type="text" value="">
so, frage ich Sie, warum oh warum dieses Ding Postback müssen server Validierung zu tun, während ich einige perfekt haben hier Javascript-Code suchen? muss ich irgendwo in einer mondlosen Nacht irgendwo auf einem Hügel ein Tier opfern?
Ist diese Hilfe, es scheint, Sie alle erforderlichen Funktionen in Ihrer Validierungs Attribut nicht überschreiben. http://stackoverflow.com/questions/8284207/asp-net-mvc-implement-custom-validator-use-iclientvalidatable –
Hallo, Patrick, danke, dass du dir die Zeit genommen hast, das Problem zu betrachten, in meiner Eile zu bekommen der kleinste reproduzierbare Code, ich übersah den zweiten IsValid-Override ... immer noch funktioniert es nicht ... Ich denke, ich muss alle damit verbundenen SO-Fragen durchgegangen sein. aber nichts ... Ich hoffe, dass jemand es an ihrem Ende der Welt reproduzieren kann, bestätige, dass ich nicht wahnsinnig werde ... – G2Mula