2011-12-04 41 views
8

MVC3 kullanıyorum ve LogIn form ve Kayıt formunu aynı sayfada kullanmak istiyorum. Ben (aynı ekranda iki formları) istediğini bana verirMVC3 KarşılaştırAttribute, istemci tarafı hatası

public class LogInRegisterViewModel 
{ 
    public LogInViewModel LogIn { get; set; } 
    public RegisterViewModel Register { get; set; } 
} 

ve denetleyicileri ve getiri düzeltmek için veri mevkilere (varsa) formları için hata verilmiştir: Ben şöyle LogInRegisterViewModel inşa ulaşmak için. Var tek sorun benim RegisterViewModel içinde Şifreyionayla yukarıdaki özelliği var CompareAttribute ile: Şifreler (eşit asla

public class RegisterViewModel 
{ 
    [Required] 
    [Display(Name = "Friendly user name")] 
    public string UserName { get; set; } 

    [Required] 
    [Display(Name = "E-mail address")] 
    public string Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    [StringLength(16, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "Passwords do not match.")] 
    public string ConfirmPassword { get; set; } 
} 

İstemci taraflı ~ Hep olduğunu bana bir mesaj ile karşılaştır gelen bir doğrulama hatası olsun onlar (eşit değildir), olsalar bile (bundan eminim). tarayıcıda HTML: Ben RegisterViewModel kullandığınızda, veri val-equalto-öteki = "* Şifre."

CompareAttribute çalışıyor:

<div class="editor-label"> 
     <label for="Register_Password">Password</label> 
    </div> 
    <div class="editor-field"> 
     <input class="valid" data-val="true" data-val-length="The Password must be at least 6 characters long." data-val-length-max="16" data-val-length-min="6" data-val-required="The Password field is required." id="Register_Password" name="Register.Password" type="password"> 
     <span class="field-validation-valid" data-valmsg-for="Register.Password" data-valmsg-replace="true"></span> 
    </div> 

    <div class="editor-label"> 
     <label for="Register_ConfirmPassword">Confirm password</label> 
    </div> 
    <div class="editor-field"> 
     <input class="input-validation-error" data-val="true" data-val-equalto="Passwords do not match." data-val-equalto-other="*.Password" id="Register_ConfirmPassword" name="Register.ConfirmPassword" type="password"> 
     <span class="field-validation-error" data-valmsg-for="Register.ConfirmPassword" data-valmsg-replace="true"><span class="" generated="true" for="Register_ConfirmPassword">Passwords do not match.</span></span> 
    </div> 

bütün bunlardan özellikle ilgili olması bir his var direkt olarak. Bunu daha önce kimseye mi geldi? Bu bir hata mı yoksa yanlış bir şey mi yapıyorum? Benim durumumda çalışmak için Karşılaştırma nasıl yapılır?

cevap

15

[Compare("Password", ErrorMessage = "Passwords do not match.")] özniteliği ile çalışmalıdır, ancak bu gerçekten jquery.validate.unobtrusive.js dosyasında bir hata gibi görünüyor. Sorun şu koddadır: 0 JVuery bulma yöntemiyle diğer denetimi bulmaya çalışır. Ama "." dot karakter, bu SO question'da açıklandığı gibi fullOtherName değişkeninde (sizin durumunuza: "Register.Password" içerecektir) kaçmadı. Bu sadece RegisterViewModel'i doğrudan kullandığınız zaman çalışmasının sebebidir, çünkü isimlerde hiçbir nokta yoktur.

düzeltmek için, appendModelPrefix işlevine bir satır eklemeniz gerekir:

//original 
function appendModelPrefix(value, prefix) { 
    if (value.indexOf("*.") === 0) { 
     value = value.replace("*.", prefix); 
    } 
    return value; 
} 

//fixed 
function appendModelPrefix(value, prefix) { 
    if (value.indexOf("*.") === 0) { 
     value = value.replace("*.", prefix); 
    } 
    value = value.split('.').join('\\.'); 
    return value; 
} 
+0

Bir çekicilik gibi çalışır, teşekkürler. –

+1

Bu düzeltmenin bile kendisinin bir hatası vardır. Javascript ".replace" yalnızca "." Ilk örneğinin yerini alır. ve gerisini yok sayar. Karmaşık modellerde, birden fazla zamana sahip olacak herhangi bir özellik orijinal kodla aynı kadere sahip olacaktır. Düzeltmek için şunu kullanmalısınız: value = value.split ('.'). Join ('\\.'); –

+0

@NickBork güzel yakalamak :). Cevabımı güncelledim. – nemesv

0

Çok iyi cevap, nemesv. çaylaklar için eklemek

Tek bir şey:

function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a} 

.min.js

yılında

function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);a=a.split('.').join('\\.');return a} 

Aksi takdirde yayınlarken, hata geri gelir olur.

İlgili konular