2011-05-19 49 views
1

我在MVC 3中使用远程验证属性来检查电子邮件地址的唯一性,并且在使用ajax表单时我无法启动它。我在两种情况下使用了一个表单_SignupForm:1.作为启用javascript的jQuery对话框,以及2.禁用javascript(也可通过浏览到页面时可用)的常规页面。ASP.NET MVC 3从Ajax表单远程验证

当我导航到正常的cshtml页面时,所有的验证都按预期工作。当我在jQuery对话框中使用表单时,除远程验证外,所有验证都起作用。

这里是我的模型:

public class SignUpModel : BaseModel 
{ 
    [Display(Name = "Your Name")] 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter your name")] 
    public string Name { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter your email address")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid email address")] 
    [Remote("EmailAddress", "Validation", ErrorMessage = "Account already exists", HttpMethod = "POST")] 
    [Display(Name = "Your Email")] 
    public string EmailAddress { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a password")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Choose a password")] 
    public string Password { get; set; } 

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

    [Display(Name = "Receive a weekly newsletter")] 
    public bool ReceiveNewsletter { get; set; } 


    public bool Agree { get; set; } 

这里是我的形式:

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "signupDialog" })) 
{ 
    @Html.ValidationSummary(true) 

    <ol> 
     @*name*@ 
     <li> 
      <div class="label"> 
       @Html.LabelFor(m => m.Name) 
      </div> 
      <div class="field"> 
       @Html.TextBoxFor(m => m.Name) 
       @Html.ValidationMessageFor(m => m.Name) 
      </div> 
     </li> 
     @*email*@ 
     <li> 
      <div class="label"> 
       @Html.LabelFor(m => m.EmailAddress) 
      </div> 
      <div class="field"> 
       @Html.TextBoxFor(m => m.EmailAddress) 
       @Html.ValidationMessageFor(m => m.EmailAddress) 
      </div> 
     </li> 
     @*password*@ 
     <li> 
      <div class="label"> 
       @Html.LabelFor(m => m.Password) 
      </div> 
      <div class="field"> 
       @Html.TextBoxFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 
     </li> 
     @*confirm password*@ 
     <li> 
      <div class="label"> 
       @Html.LabelFor(m => m.ConfirmPassword) 
      </div> 
      <div class="field"> 
       @Html.TextBoxFor(m => m.ConfirmPassword) 
       @Html.ValidationMessageFor(m => m.ConfirmPassword) 
      </div> 
     </li> 
     @*newsletter*@ 
     <li> 
      <div class="field"> 
       @Html.CheckBoxFor(m => m.ReceiveNewsletter) 
      </div> 
      <div class="label"> 
       @Html.LabelFor(m => m.ReceiveNewsletter) 
      </div> 
     </li> 
     @*terms*@ 
     <li> 
      <div class="field"> 
       @Html.CheckBoxFor(m => m.Agree) 
      </div> 
      <div class="label"> 
       @Html.LabelFor(m => m.Agree) 
      </div> 
     </li> 
     <li> 
      <input type="submit" value="Save" />   
     </li> 
</ol> 
} 

当我检查使用Firebug的领域,这是我看到在两种情况下:

<input id="EmailAddress" type="text" value="" name="EmailAddress" data-val-required="Please enter your email address" data-val-remote-url="/garden/Validation/EmailAddress" data-val-remote-type="POST" data-val-remote-additionalfields="*.EmailAddress,*.UserId" data-val-remote="Account already exists" data-val="true"> 

在此先感谢您的帮助。

编辑 多一点挖之后,看来该客户端验证是不是在我的jQuery的对话框工作在所有。这甚至有可能吗?

+0

你是如何修复它的? – bjan 2012-06-18 09:56:55

回答

1

我在MVC3中的远程验证有同样的问题。在我的情况下,我使用JQuery.load()方法动态加载JQuery.dialog()中的表单。

我可以随各自的js文件设置unobstrusive和clientvalidation标志,通过调用以下形式加载后得到客户的验证工作,只要我有:

$.validator.unobtrusive.parse($("form")); 

然后,使前我的$就调用后的结果,我检查,看看是否形式是有效的:

if ($(form).valid()) { 

这会导致客户端火,给我客户端验证。但是,如果发生这种情况,它还会触发MVC远程验证代码,但是会显示空值,导致远程验证方法失败,因为没有任何可比较的内容。

+0

那么你是如何修复它的? – bjan 2012-06-18 09:57:37