2013-07-26 65 views
4

我使用MVC4瓦特/ JQuery和我有我使用@ Ajax.BeginForm創建的窗體。它具有必需的字段(在其視圖模型上設置)。我試圖在提交回來之前驗證表單;但是,它似乎沒有驗證。jquery驗證始終返回true

我原本有一個提交按鈕,它只是提交表單。我將提交按鈕更改爲常規按鈕,並嘗試調用$('#formname').validate(),但始終返回true(即使未填寫必填字段)。其他視圖似乎很好(不使用Ajax.BeginForm)。

我引用jquery,jquery-ui,jquery.validate,jquery.validate.unobtrusive和jquery.unobtrusive-ajax。

任何人有任何想法/建議我失蹤?

編輯--------------------------------------------- ------------------------------

下面是我的代碼(這是在一個引用jquery腳本的母版頁):

@model AimOnlineMRA.Models.Reports.DateRangeViewModel 

@using (Ajax.BeginForm("GetReport", "Reports", new AjaxOptions 
{ 
    UpdateTargetId = "report_pane", HttpMethod = "Post"}, new {@id="parameterForm"})) 
{ 
    @Html.AntiForgeryToken() 

<script type="text/javascript"> 
    $(document).ready(function() { 
     ApplyTheme(); 

     $('#btnYes').click(function() { 
      $('#RunSpecificDateRange').val('true'); 

      $('#yesNo').hide(); 
      $('#dateRangeForm').show(); 
     }); 

     $('#btnCancel').click(function() { 
      $('#report_pane').html('').hide(); 
     }); 

     $('#btnOk').click(function() { 
      //if ($('#parameterForm').valid()) { 
      // alert('valid'); 
      //} else { 
      // alert('invalid'); 
      //} 
     }); 

     $('#dateRangeForm').hide(); 

     $('#BeginDate').datepicker({ 
      showOn: 'button', 
      buttonText: 'Date Picker', 
      buttonImageOnly: true, 
      buttonImage: '@Url.Content("~/Content/Icons/calendar-icon.png")' 
     }); 

     $('#EndDate').datepicker({ 
      showOn: 'button', 
      buttonText: 'Date Picker', 
      buttonImageOnly: true, 
      buttonImage: '@Url.Content("~/Content/Icons/calendar-icon.png")' 
     }); 
    }); 
</script> 

<div class="margin-auto" style="width: 400px"> 

    <div id="yesNo"> 
     <span class="bold">Do you want to run this report for a specific date range?</span> 
     <br /><br /> 
     @Html.Button("Yes", "btnYes") 
     @Html.Button("No", "btnNo") 
    </div> 
    <div id="dateRangeForm"> 
     <span class="bold">Date Range</span> 
     <br /><br /> 
     <div class="left"> 
      <div class="left clear-both"> 
       @Html.LabelFor(x => x.BeginDate) <br /> 
       @Html.TextBoxFor(x => x.BeginDate, new {@style="vertical-align:top"}) 
       @Html.ValidationMessageFor(x => x.BeginDate) 
      </div> 
      <div class="left clear-both m-top-5"> 
       @Html.LabelFor(x => x.EndDate) <br /> 
       @Html.TextBoxFor(x => x.EndDate, new {@style="vertical-align:top"}) 
       @Html.ValidationMessageFor(x => x.EndDate) 
      </div> 
     </div> 
     <div class="left m-left-10"> 

     </div> 
     <div class="left clear-both m-top-10"> 
      @Html.Button("Ok", "btnOk") 
      @Html.Button("Cancel", "btnCancel") 
     </div> 
    </div> 
</div> 
} 

-----------------解決方案----------------------- ------

調用$.validator.unobtrusive.parse($('#parameterForm'));$('#parameterForm').valid();前修復問題

+3

請發佈一些相關的代碼,也許使用jsfiddle.net – Tdelang

+0

不你的模型在指定的字段上有[Required]屬性?你使用Razor HtmlHelpers創建輸入嗎? –

+0

是的,我在vm上有[Required],我確實使用剃刀助手創建了它們。這是我在鉻中查看時輸出的必填字段之一 spyter

回答

22

嘗試

$.validator.unobtrusive.parse($('#parameterForm'))

調用

$('#parameterForm').valid()

+1

這似乎沒有爲我工作。即使在必填字段中沒有數據,我仍然可以獲得真實的返回值。任何想法爲什麼這可能發生? – masterwok

+0

我隱約明白它爲什麼有效。優秀!謝謝! –

+0

這爲我工作。謝謝! –

1

您是否需要添加到<input><textarea>的HTML標記?

IE:

<input id="cemail" type="email" name="email" required/> 
+0

我在窗體視圖模型上有[必需的]屬性。在瀏覽器中查看html輸出,我有以下(對於其中一個必填字段): spyter

8

問題之前已經有一個公認的答案,但這裏的另一個可能的原因是任何人發現Ť他的未來......

確保在表格第一個驗證元素具有name屬性,像這樣:

<input type=text required name='blah' /> 

我花了2小時追查這個同樣的問題,我發現如果表單中的FIRST驗證元素具有name屬性,則所有內容都按預期工作(即如果表單無效,則.valid()將返回false)。其他驗證元素是否具有名稱屬性似乎沒有區別。

在正常形式中,您肯定需要名稱屬性,因爲這是數據提交到服務器時使用的名稱屬性。但是在更現代的環境中,比如那些使用Knockout的環境,沒有理由對輸入元素具有name屬性,因爲數據綁定的作用是保持數據模型的更新。

+1

爲我節省了一些時間:)謝謝 –

+0

添加'name'屬性有幫助,但我仍然得到驗證=真(jQuery驗證插件 - v1.13.0)。所以我用下面的代碼解決了這個問題: \t [code] var validator = $(「#login-form」)。validate(); \t validator.form(); \t alert(「validator.numberOfInvalids()=」+ validator.numberOfInvalids()); \t \t如果(validator.numberOfInvalids()!= 0) \t { \t \t警報( 「驗證失敗」); \t \t return; \t} \t alert(「validation passed - continue」); [/ code] – Mark

+1

您應該理解'unobtrusive'和normal驗證之間的區別。 – Dementic

-2

我引用這兩個文件:

  • jquery.validate。js
  • jquery.validate.unobstrusive.js < - 刪除此參考!

移除參考jquery.validate.unobstrusive.js,固定對我來說

希望這可以幫助別人

+2

這些腳本根本不衝突。 'jquery.validate.unobtrusive.js'工作需要'jquery.validate.js'。你必須有其他地方。 –

+0

您隨時隨地發佈此信息。這不是答案。 – ps2goat

+0

這一個幫助我 –