2010-04-16 6 views
5

Ich benutze xval, um clientseitige Validierung in meiner asp.net mvc2 Web-Anwendung zu verwenden. Trotz der Fehler, die es gibt, wenn ich Text in ein numerisches Feld einfüge, versucht es immer noch, das Formular an die Datenbank zu senden. Die falschen Werte werden durch 0 ersetzt und in der Datenbank gespeichert. Stattdessen sollte es nicht einmal möglich sein, das Formular zu senden. Kann mir hier jemand helfen?C# mvc2 clientseitige Formularvalidierung mit xval, verhindern Beitrag

Ich habe die Attribute, wie im Folgenden beschrieben:

[Property] 
[ShowColumnInCrud(true, label = "FromPriceInCents")] 
[Required] 
//[Range(1, Int32.MaxValue)] 
public virtual Int32 FromPriceInCents{ get; set; } 

Der Controller die Anforderung, wie unten schaut zu kontrollieren; Ich bekomme keine Fehler in diesem Teil.

[AcceptVerbs(HttpVerbs.Post)] 
[Transaction] 
[ValidateInput(false)] 
public override ActionResult Create() 
{ 
    //some foo happens 
} 

Meine Ansicht sieht unten wie:

<div class="label"><label for="Price">FromPrice</label></div> 
<div class="field"> 
<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("product.FromPriceInCents")%></div> 

Und am Ende der Ansicht i die folgende Regel haben, die in HTML-Code erzeugt die richtigen Validierungsregeln

<%= Html.ClientSideValidation<Product>("Product") %> 

Ich hoffe, jemand kann mir mit diesem Problem helfen, danke im Voraus!

BEARBEITEN: 19. April Ich habe gerade herausgefunden, dass es eine normale Schaltfläche mit verwendet wird anstelle einer Eingabe type = "Button" Könnte dies das Problem sein?

<button class="save" type="submit" name="save"><span>Opslaan</span></button> 
+1

Warum ist Ihre Validation ("product.FromPriceInCents"), aber Ihre Textbox verwendet "FromPriceInCents"? Dies scheint verdächtig. Gibt es einen Grund, warum Sie die stark typisierten Helfer nicht benutzen? ValidationMessageFor (x => x.FromPriceInCents) – Jab

+0

Ich habe die Textboxen und Validierungsnachrichten in stark typisierte Helfer geändert. Aber diese Änderung hat keinen Einfluss auf die Validierung, trotzdem guter Tipp! – Rob

Antwort

0

Warum haben Sie das Range-Attribut auskommentiert? Mit den Eigenschaften, die Sie angegeben haben, solange alles in das Textfeld eingegeben wird, sollte es die clientseitige Validierung bestehen.

+0

Das Bereichsattribut ist ein Test. Aber ich werde versuchen, es wieder anzulegen und zu sehen, was passiert. – Rob

+0

OK ich habe es versucht, die clientseitige Validierung gibt diesen Fehler; Bitte geben Sie einen Wert zwischen 1 und 2147483647 ein. Aber in Firebug kann ich sehen, dass die Seite noch versucht, ein Postback zu tun, aber es gibt den Fehler unten zurück; 'Objektverweis nicht auf eine Instanz eines Objekts gesetzt.' – Rob

+0

Versuchen Sie erstellen Maßnahmen, um den Objekttyp wie diese public Action mit Create (Objecttype newObject) – MHinton

2

Meine erste und wichtigste Sorge hier wäre: Warum speichert Ihre App die Werte in der Datenbank in erster Linie? Während xVal eine gute Möglichkeit ist, die Anwendung benutzerfreundlich zu machen, MÜSSEN Sie immer noch serverseitige Validierung durchführen. Wenn Sie Ihre Daten nicht auf dem Server validieren, haben Sie ein großes Sicherheitsloch! Überprüfen Sie vor dem Speichern der Werte, ob ModelState.IsValid in Ihrem Controller vorhanden ist.

nun von dem, was ich sehe, dass Sie die Registrierung der xVal Validierung mit

<%= Html.ClientSideValidation<Product>("Product") %> 

Die Funktionsweise ist es Clientseite Validierung für alle Steuerelemente mit dem Präfix „Produkt“ ermöglicht. Ihre Textbox auf der anderen Seite hat eine ID von FromPriceInCents

So ist die Lösung hier wäre, dies zu tun:

<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("FromPriceInCents")%> 

<%= Html.ClientSideValidation<Product>() %> 

UPD3 ich den Posten aktualisiert. Der Code wurde so korrigiert, dass das Präfix nicht verwendet wird.

Außerdem habe ich eine funktionierende Lösung zusammengestellt, die eine funktionierende Lösung enthält. List, Edit, Create Seite, String und Int-Eigenschaften und xVal Validierung.

public class Product 
{ 
    [ScaffoldColumn(false)] 
    public int Id { get; set; } 

    [Required] 
    [Range(1,50)] 
    public int PriceInCents { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 
} 

und auf der Ansicht ist

<%= Html.TextBoxFor(model => model.PriceInCents) %> 
<%= Html.ValidationMessageFor(model => model.PriceInCents) %> 

Hier ist der Download-Link ..Check it out und mir sagen, ob es http://www.flexlabs.org/download/xValTest

+0

Dank für die gute Antwort, ich werde versuchen, Ihre Lösung und lassen Sie es wissen. Sie haben Recht mit der serverseitigen Validierung, das muss ich in der Tat noch beheben. – Rob

+0

Ich habe Ihre Lösung versucht, indem ich das Präfix der Textbox hinzugefügt habe. Aber dann funktioniert die Validierung überhaupt nicht. Wenn ich es so benutze; <% = Html.TextBox ("FromPriceInCents")%> <% = Html.ValidationMessage ("product.FromPriceInCents")%> <% = Html.ClientSideValidation ("Produkt")%> Die Validierung zeigt mir Fehler an, wenn ich Text in eine Box eingabe, die Zahlen erwartet. Aber wenn ich versuche, die Seite einzureichen, tut es immer noch ein Postback, etwas, das ich nicht erwarte und es tun möchte. Get serverside Validierung arbeitet jetzt mit Modelstate.IsValid – Rob

+0

Ah ja, das ist, weil die Create-Methode konnte nicht die Werte aus den Formularwerten puck .. Ich aktualisierte den Beitrag mit einem Beispiel –