2013-02-02 1 views
0

J'ai un modèle avec nombre de règles de validation:reqular expression ne fonctionne pas dans ASP.NET MVC2 application

[Required(ErrorMessage = "Number must be enter")] 
    [RegularExpression("^[0-9]{1,10}$", ErrorMessage = "Your must be enter only integer number between 0-10 simvols")] 
    public int Number 
    { 
     get { return number; } 
     set { number = value; } 
    } 

donc ma validation ne work.i pas vérifier mon code, mais ne peut pas trouver où je l'ai fait faux. Cela fait partie de mon modèle de vue:

<% using (Html.BeginForm()) 
    {%> 
<%: Html.ValidationSummary(true) %> 
<div class="editor-label"> 
    <p class="number"> 
     Enter number</p> 
    <%: Html.TextBoxFor(model => model.Number, new {@class = "txtNumber"})%> 
    <%: Html.ValidationMessageFor(model => model.Number) %> 
</div> 
<p> 
    <input type="submit" value="Calculate" class="button" /> 
</p> 
<% } %> 
+0

Etes-vous sûr qu'il ne fonctionne pas? Vérifiez-vous ModelState.IsValid dans votre méthode de publication? –

+0

Oui, je suis sûr, s'il vous plaît regardez cette vidéo: http: //screencast.com/t/6vS1X12c9Sak –

+0

Pourquoi faites-vous même de cette façon? Vous devriez plutôt utiliser une méthode liée au modèle. Si vous faites de Number un null, alors à la place de FormCollection avez 'int? Number' dans votre liste de paramètres, la valeur sera automatiquement liée et convertie en int. Vous pouvez ajouter une validation Range pour vous assurer qu'elle se situe dans la plage correcte. –

Répondre

2

Votre expression régulière devrait être ceci:

"^([0-9]|10)$" 

EDIT:

Votre vrai problème, est cependant que vous ne faites pas les choses correctement. Vous utilisez un type int dans votre modèle. Mais alors vous utilisez FormCollection dans votre action de publication. FormCollection contourne le classeur du modèle et vous donne tout ce qui est tapé.

Vous devriez plutôt être un modèle liant votre valeur, et vous devriez en faire un entier nul dans votre modèle. La raison en est que int est un type de valeur, et ne peut pas être nul. Par conséquent, il doit toujours contenir une valeur, ce qui dans le cas où vous entrez du texte signifie que la valeur sera 0 et que 0 passe votre validation, le ModelState.IsValid retournera vrai.

Au lieu de cela, faites ceci:

[Required(ErrorMessage = "Number must be enter")] 
[Range"^[0-9]{1,10}$", 
    ErrorMessage = "Your must be enter only integer number between 0-10 simvols")] 
public int? Number {get;set;} 

Ensuite, dans votre méthode d'action:

public ActionResult Index(MyModel model) { 
    if (ModelState.IsValid) { 
     // model.Number is now an integer already, and IsValid will be false for no number 
    } 
} 
+0

Mystère, pourquoi? J'ai testé mon exprssion et je suis sûr que cela fonctionne –

+0

@ ElvinArzumanoğlu - parce que votre expression régulière ne valide pas un nombre de 1-10 comme votre message d'erreur l'indique. C'est n'importe quel chiffre de 0-9, 1-10 fois. –

+0

@ ElvinArzumanoğlu - voir la mise à jour, notez également que si vous avez l'intention de prendre 10 chiffres, vous déborderez un 'int' après' 2 147 483 647', ce qui vous causera des problèmes –

1

Assurez-vous que vos éléments sont enveloppés dans les balises Html.BeginForm. Les validations ne fonctionnent que si vos contrôles sont à l'intérieur <formulaire> élément.

+0

Merci Hitesh.Aneja. Je sais cela, j'ai écrit html.beginform. Mais rien ne s'est passé. –

+0

Je change mon code, s'il vous plaît regarder. –

Questions connexes