10

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?

+0

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 –

+0

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

Antwort

18

Ich frage mich, was passieren würde, wenn Sie nevervalid.js geändert, so dass der Code ausgeführt wird, bevor das Dokument bereit ist.

Mein Grundgedanke ist, dass die unauffällige Validierung funktioniert, indem das Dokument analysiert wird, wenn dom bereit ist ... aber wenn Sie Ihre eigenen Validierungsdaten zur gleichen Zeit/danach laden, wird es nicht wissen, was zu tun ist wenn es um Ihr eigenes Validierungsdaten-Attribut geht.

Wie auch immer, versuchen nevervalid.js Wechsel einfach zu sein:

(function($) { 
    $.validator.addMethod("nevervalid", function() { 
     return false; 
    }, "Clientside Should Not Postback"); 

    $.validator.unobtrusive.adapters.addBool("nevervalid"); 
})(jQuery); 
+1

Du bist der Main() est! – G2Mula

+0

ja, funktioniert immer noch und die Bearbeitung sieht viel weniger "nackt" aus, benutzt zu lange jQuery und da sind ein paar Sachen drin Ich habe vergessen zu fragen, was sie eigentlich meinen ... – G2Mula

+2

Alles gut, froh, dass es dir das Problem behoben hat . Die Bearbeitung war nur eine Best-Practice-Sache :-) – Charlino