2010-04-16 3 views
5

J'utilise xval pour utiliser la validation côté client dans mon application web asp.net mvc2. Malgré les erreurs qu'il donne quand je saisis du texte dans un champ numérique, il essaie toujours d'afficher le formulaire dans la base de données. Les valeurs incorrectes sont remplacées par 0 et enregistrées dans la base de données. Mais au lieu de cela, il ne devrait même pas être possible d'essayer de soumettre le formulaire. Est-ce que quelqu'un pourrait m'aider?C# mvc2 validation de formulaire côté client avec xval, prévenir poste

J'ai mis les attributs ci-dessous:

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

Le contrôleur attrapant la demande se présente comme ci-dessous; Je ne reçois aucune erreur dans cette partie.

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

Mon point de vue ressemble ci-dessous:

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

Et à la fin de la vue que j'ai la règle suivante qui code html génère les règles de validation correctes

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

J'espère Quelqu'un peut m'aider avec ce problème, merci d'avance!

EDIT: 19 avril Je viens de découvrir qu'il existe un bouton normal à utiliser à la place d'un type d'entrée = "Button" Serait-ce le problème?

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

Pourquoi votre ValidationMessage ("product.FromPriceInCents") mais votre zone de texte utilise "FromPriceInCents"? Cela semble suspect. Y a-t-il une raison pour laquelle vous n'utilisez pas les helpers fortement typés? ValidationMessageFor (x => x.FromPriceInCents) – Jab

+0

J'ai modifié les zones de texte et les messages de validation pour les helpers fortement typés. Mais ce changement n'affecte pas la validation, néanmoins bon conseil! – Rob

Répondre

0

Pourquoi l'attribut Range est-il mis en commentaire? Avec les propriétés que vous avez spécifiées tant que quelque chose est entré dans la zone de texte, il devrait passer la validation côté client.

+0

L'attribut range est un test. Mais je vais essayer de le remettre et voir ce qui se passe. – Rob

+0

OK, je l'ai essayé, la validation côté client donne cette erreur; Veuillez entrer une valeur entre 1 et 2147483647. Mais dans firebug je peux voir que la page essaie toujours de faire une publication, mais elle renvoie l'erreur ci-dessous; 'Référence d'objet non définie sur une instance d'un objet.' – Rob

+0

Essayez d'avoir votre action Créer prendre le type d'objet comme celui-ci public ActionResult Créer (TypeObjet newObject) – MHinton

2

Ma première et principale préoccupation ici serait: pourquoi votre application enregistre-t-elle les valeurs dans la base de données en premier lieu? Bien que xVal soit un bon moyen de rendre l'application conviviale, vous devez effectuer une validation côté serveur. Si vous ne validez pas vos données sur le serveur, vous avez un trou de sécurité masquant! Essayez de vérifier si ModelState.IsValid dans votre contrôleur avant d'enregistrer les valeurs.

Maintenant, ce que je vois que vous vous inscrivez la validation xVal à l'aide

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

La façon dont cela fonctionne est qu'il permet la validation du côté client pour toutes les commandes préfixées avec « produit ». Votre zone de texte d'autre part a un id de FromPriceInCents

Donc, la solution serait ici de faire:

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

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

UPD3 Je mis à jour le poste. Correction du code pour que le préfixe ne soit pas utilisé.

En outre, j'ai compilé une solution de travail qui contient une solution de travail. Liste, Modifier, Créer une page, les propriétés string et int, et la validation xVal.

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; } 
} 

et sur la vue

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

est ici le lien de téléchargement ..Regardez et dites-moi si cela fonctionne http://www.flexlabs.org/download/xValTest

+0

Merci pour la bonne réponse, je vais essayer votre solution et vous le faire savoir. Vous avez raison sur la validation côté serveur, j'ai en effet encore besoin de résoudre ce problème. – Rob

+0

J'ai essayé votre solution en ajoutant le préfixe à la zone de texte. Mais alors la validation ne fonctionne pas du tout. Quand je l'utilise comme ça; <% = Html.TextBox ("FromPriceInCents")%> <% = Html.ValidationMessage ("product.FromPriceInCents")%> <% = Html.ClientSideValidation ("produit")%> La validation me montre des erreurs quand j'entre le texte dans une boîte attendant des nombres. Mais quand j'essaie de soumettre la page, elle fait toujours une publication, quelque chose que je n'attends pas et que je veux faire. La validation côté serveur a fonctionné maintenant avec Modelstate.IsValid – Rob

+0

Ah oui, c'est parce que la méthode Create n'a pas pu ranger les valeurs des valeurs de formulaire .. J'ai mis à jour le poste avec un exemple –

Questions connexes