2011-07-15 4 views
3

Quelque chose d'étrange se passe ici.Validation de comparaison côté client MVC 3

J'ai une forme de base:

<% using (Html.BeginForm()) 
     { %> 
     <%: Html.LabelFor(model => model.user.email) %> 
     <%: Html.TextBoxFor(model => model.user.email) %> 
     <%: Html.ValidationMessageFor(model => model.user.email) %> 
     <br /> 
     <%: Html.LabelFor(model => model.user.password) %> 
     <%: Html.PasswordFor(model => model.user.password) %> 
     <%: Html.ValidationMessageFor(model => model.user.password) %> 
     <br /> 
     <%: Html.LabelFor(model => model.user.confirmPassword) %> 
     <%: Html.PasswordFor(model => model.user.confirmPassword) %> 
     <%: Html.ValidationMessageFor(model => model.user.confirmPassword) %> 
     <br /> 
     <input type="submit" value="Submit" /> 
    <% } %> 

La tête a les suivantes:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> 
<link rel="Stylesheet" type="text/css" href="/Content/Site.css" /> 
<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script> 

Le ViewModel est la suivante:

public class RegisterViewModel 
{ 
    public RegisterUser user { get; set; } 
} 

public class RegisterUser 
{ 
    [Required] 
    [Display(Name = "Email Address")] 
    public string email { get; set; } 

    [Required] 
    [Display(Name = "Password")] 
    public string password { get; set; } 

    [Required] 
    [Display(Name = "Confirm Password")] 
    [Compare("password")] 
    public string confirmPassword { get; set; } 
} 

La comparaison validation entre le mot de passe et confirmPassword toujours dit:
'Confirmer le mot de passe' et 'mot de passe' ne correspondent pas.
même si je sais qu'ils correspondent

Voici la partie étrange: lorsque je supprime le premier champ de la page de vue, tout fonctionne.

Alors, quand il est juste

<% using (Html.BeginForm()) 
    { %> 
    <%: Html.LabelFor(model => model.user.password) %> 
    <%: Html.PasswordFor(model => model.user.password) %> 
    <%: Html.ValidationMessageFor(model => model.user.password) %> 
    <br /> 
    <%: Html.LabelFor(model => model.user.confirmPassword) %> 
    <%: Html.PasswordFor(model => model.user.confirmPassword) %> 
    <%: Html.ValidationMessageFor(model => model.user.confirmPassword) %> 
    <br /> 
    <input type="submit" value="Submit" /> 
<% } %> 

tout fonctionne parfaitement.

Des idées?

Merci.

+0

Pouvez-vous préciser ce que vous essayez de réaliser? – saarthak

+1

@Calvin, j'ai le même problème avec Razor. Apparemment, la validation des données correspond à votre champ de mot de passe comme ceci: * .Password, qui correspond à toutes les instances de RegisterUser, plutôt que RegisterUser.Password. –

Répondre

5

Ce bogue dans le script de validation côté client: jquery.validate.unobtrusive.js

à la ligne ~ 284, vous trouverez ceci:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0]; 

Modifier à ceci:

element = $(options.form).find(":input[name='" + fullOtherName + "']")[0]; 

L'attribut name nécessite des guillemets simples.

+2

Merci l'homme! Votre réponse est 100% correcte! –

-1

Est-ce parce que vous utilisez

<%: 

Plutôt que

<%= 

Je ne suis pas sûr que la sortie des aides plus besoin échapper.

+0

aucune différence en utilisant <% = versus <%: – Calvin

+1

Vous répondez est faux! –

Questions connexes