2012-03-24 9 views
0

Ich versuche, die clientseitige Validierung in einem sehr einfachen Beispiel zu verwenden, und es funktioniert nicht. Ich ging von einem bestehenden Beispiel aus dem Internet aus.Client Validierung funktioniert nicht an einem sehr einfachen Beispiel

Hier ist (siehe akzeptierte Antwort): ASP .Net MVC 3 unobtrusive custom client validation

Im Grunde ist es nutzt diesen Blog als Lösung: http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/

Also habe ich aus einer leeren Lösung gestartet und würde validieren möchten, dass ein Preis größer als ein Minimum.

My Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(MinPriceViewModel model) 
    { 
     if (!ModelState.IsValid) 
      return View(model); 

     return Content("Thank you very much"); 
    } 
} 

Meine Ansicht Modell:

public class MinPriceViewModel 
{ 
    [MinPrice(MinPrice=9.99)] 
    [Required] 
    public double Price { get; set; } 
} 

Das Attribut für die Validierung (Client-Server &):

public class MinPriceAttribute : ValidationAttribute, IClientValidatable 
{ 
    public double MinPrice { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return true; 

     var price = Convert.ToDouble(value); 

     if (price < MinPrice) 
     { 
      return false; 
     } 

     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return "Attention le champ " + name + " ne contient pas un prix acceptable."; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     yield return new ModelClientValidationRule 
     { 
      ErrorMessage = this.ErrorMessage, 
      ValidationType = "minprice" 
     }; 
    } 
} 

Die Ansicht:

@model MinPriceValidation.Models.MinPriceViewModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 

<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script> 
<script src="../../Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(function() { 
     jQuery.validator.unobtrusive.adapters.addBool('minprice'); 
    }); 
</script> 

@using(Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.Price) 
    @Html.TextBoxFor(m => m.Price) 
    @Html.ValidationMessageFor(m => m.Price) 

    <input type = submit /> 
} 

Ich habe einen Breakpoint auf meiner Post-Aktion in meinem Controller platziert, um zu überprüfen, ob die Client- oder Servervalidierung stattgefunden hat. Wenn ich die Lösung leite und ich 1 gebe und abschicke, ist der Haltepunkt in meinem Controller erreicht (Post-Aktion) >> Ich kam zu dem Schluss, dass die Client-Validierung niemals verwendet wird.

Ich habe nicht verstanden, weil ich von dem grundlegenden Beispiel (Kreditkartenvalidierung) begann und ich weiß, dass diese Kreditkartenvalidierung in Client Validierung funktioniert (ich testete es in einer anderen Lösung).

Ich bin ein bisschen verloren.

Eine Idee, warum die Client-Validierung nicht funktioniert hat?

Danke.


UPDATE

Nach vielen googeln, sehe ich, dass einige Leute sagen wir eine Javascript-Funktion für die Client-Validierung wie diese benötigen:

jQuery.validator.addMethod("minprice", function (value, element, param) { 
     // Perform tests here for client validation 
     return (value>10); 
    }); 

    jQuery.validator.unobtrusive.adapters.addBool('minprice'); 

Als ich mit diesem hinzugefügt testen JavaScript-Funktion funktioniert, aber es scheint mir seltsam, dass die creait-Karte Beispiel keine JavaScript-Funktion in der Ansicht für die Überprüfung der Kreditkarte hat !!

Ich bin immer noch verloren.

Antwort

1

Wenn Sie sagen, dass Sie Menschen sehen dies mit mit Kreditkarte und es funktioniert ohne die Notwendigkeit einer benutzerdefinierten JavaScript-Funktion Ich nehme an, Sie beziehen sich auf die following post.

Ein credit card validation rule ist direkt im jquery validate-Plugin integriert. Aus diesem Grund müssen Sie keine benutzerdefinierte Validierungsfunktion schreiben.

Soweit eine minprice Regel betroffen ist, gibt es keine solche Sache, so dass Sie eine benutzerdefinierte Javascript-Funktion schreiben müssen, um zu definieren, was bedeutet.

Vor diesem Hintergrund sei ich das Gefühl, dass Sie mit diesem Attribut einige Rad neu zu erfinden, wie Sie einfach tun könnte:

[Range(9.99, double.MaxValue)] 
[Required] 
public double Price { get; set; } 

und da wir über Preise sprechen, empfiehlt es sich auf einen Dezimal-Typ zu verwenden Ihr Modell:

Jetzt erhalten Sie automatische Client-Seite und serverseitige Validierung.

+0

Yuo haben Recht. Ich wusste es nicht. Danke. – Bronzato

+0

Das funktioniert, aber wenn sich der Mindestpreis ändert, brauchen Sie einen Programmierer, um den Code zu ändern. Dies ist eine Marketingregel und sollte dynamisch und von Nicht-Programmierern geändert werden, ohne dass die Anwendung neu erstellt oder neu implementiert werden muss. – RickAndMSFT

1

Achten Sie darauf, diese Einstellung in web.config erfüllt sind:

<appSettings> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 

Und dieses Skript sind auf der Seite:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<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> 
+0

ja, die Einstellungen sind in meiner web.config korrekt und ja, Skript enthalten aber immer noch kein Glück. Danke trotzdem. – Bronzato

+0

Aktualisiert. Könnte an deiner Rendite liegen. –

+0

Geändert mit Liste <.... funktioniert auch nicht. – Bronzato

Verwandte Themen