2011-03-11 132 views
13

我正在嘗試手動驗證,以便通過AJAX發佈我的表單。ASP.Net MVC 3使用動態表單驗證客戶端

ALSO我加載動態使用$("#formHolder").load(url);

當我加載頁面到它始終驗證爲真DIV我的形式,即使我的輸入框爲空。

即電話if($("#MyForm").valid()) //is always true

但是如果我去的頁面URL直接它工作正常。

所以,我怎麼能初始化形式通過.load(url);加載它之後正確,因爲它不存在於頁面上首次打開時

我的JavaScript

$('.myLink').click(function() { 
    var url = '/newsletter/info/'; // this loads my HTML form from another page/view at runtime 
    $("#formHolder").load(url, function() { 
      $("#MyForm").validate(); // I thought this line would initialise it once it loads 
      }).dialog({ 
     modal: true, 
     width:800, 
     height: 600 
    }); 
    return false; 
}); 

回答

15

調用$.validator.unobtrusive.parse()形式已經被加載之後,手動作品

,我發現這裏的解決方案http://btburnett.com/2011/01/mvc-3-unobtrusive-ajax-improvements.html

+0

位更改:$ .validator – Morteza 2012-11-11 12:48:32

+1

提示:您需要指定選擇器:例如解析('body') – ulrichb 2013-08-28 07:40:27

+0

同意@ulrichb。沒有選擇器(或jQuery對象)它不適合我。順便說一句:更大的範圍將意味着最差的性能,所以應該發送'$(「#MyForm」)'或者你動態加載的任何元素來代替'body'' – Diego 2015-05-28 20:22:04

8

,如果你需要你的問題不指定做任何事情來自定義來驗證表單,所以我肯定會用MVC3的內置jQuery不顯眼的驗證:

如果這是你的型號:

public class Person 
{ 
    [Required(ErrorMessage = "Email address required")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter valid email address")] 
    public string Email { get; set; } 
} 

在您看來這個表單的代碼將立即啓用驗證與設置的最低金額:

@model MvcApplication12.Models.Person 

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Ajax.BeginForm(new AjaxOptions())) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

如果您想了解更多的功能,當表單發送您可以使用AjaxOptions:

new AjaxOptions() { UpdateTargetId = "formupdate", 
        OnSuccess = "javascript:alert('success');", 
        OnFailure = "javascript:alert('failure');", 
        OnComplete = "javascript:alert('complete');", 
        OnBegin = "javascript:alert('begin');" }) 

這使您可以在表單提交,完成,失敗或開始時完全控制自定義操作。

希望這會有所幫助!

+0

謝謝,這是一個很好的答案,我從中學到了很多東西。然而,經過一番挖掘,我意識到我的問題只發生在表單加載時,我已經更新/改變我的問題,同時你回答。抱歉。但我認爲你的電子郵件將有助於很多人一樣 – Daveo 2011-03-11 13:10:34

+0

哈哈:)我敢肯定,這跟驗證器-javascript如何掛鉤事件有關。由於這些元素在頁面加載時不存在,但稍後添加到DOM,因此它可能不會正確註冊這些事件(例如,不使用.live())。我必須說,我從來沒有使用過.validate()方法,所以不太確定那是做什麼的。 – 2011-03-11 13:32:03

9

最好的解決方法是調用$.validator.unobtrusive.parse('#frmToBeValidated'),動態表單的你的Ajax負載之後。