2011-11-30 170 views
0

我創建了一個簡單的自定義驗證,以使進入確認時間爲12小時格式和文字輸入有一個'99:99' 掩模組,因此我將獲得:ASP.NET MVC自定義驗證

12 :00

驗證工作在服務器上的偉大:

 private ValidationResult ValidateTwelveHourFormat(string time, ValidationContext validationContext) 
    { 
     if (String.IsNullOrWhiteSpace(time.Substring(0, 1)) 
      || Convert.ToInt32(time.Substring(0, 1)) > 1 
      || Convert.ToInt32(time.Substring(1, 1)) > 2 
      || Convert.ToInt32(time.Substring(3, 1)) > 5) 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
     return ValidationResult.Success; 
    } 

但是,客戶端不行爲方式上相同的驗證我希望:

$.validator.unobtrusive.adapters.addSingleVal('timeformat', 'format'); 
$.validator.addMethod('timeformat', function (value, element, timeformat) { 
if (value) { 
    if (timeformat == "TwelveHour") { 
     if (value.toString().substring(0, 1) == "" 
       || value.toString().substring(0, 1) > 1 
       || value.toString().substring(1, 1) > 2 
       || value.toString().substring(3, 1) > 5) { 
      return false; 
     } 
    } 
} 
return true; 
}); 

客戶端將僅正確驗證第一個數字。所以如果我輸入了3,它會觸發很好,但不適用於字符串中的任何其他位置。我在那裏扔了一些警報,當我在文本中輸入一個字符時,它似乎觸發了這個方法。這種行爲令我感到困惑,因爲我認爲在表單首次提交之前這種情況並沒有發生,只有在此之後。否則,用戶會在第一次進入窗體時看到錯誤消息,我不認爲使用驗證方式的瀏覽器通常可以正常工作。

1.)爲什麼客戶端不能正確驗證其他字符位置?
2.)客戶爲什麼在表單尚未提交時進行驗證?

更新

1)我用JavaScript的SUBSTR(),因爲它的作用就像C#的String.Substring()。

對於問題2 - 我在mvc框架中使用了Data Annoations。假設我有一個被設置爲必需的字段。當我第一次輸入該表單時,該字段不會觸發模糊驗證。我可以輸入廢話,刪除垃圾,但不會觸發驗證。這就是我困惑的原因。這似乎與默認行爲有所不同。我會認爲,在提交嘗試嘗試之後會觸發驗證,就像我提到的示例一樣。

回答

1

問題1:

的Javascript String.substring()作品不同於C#。第二個參數不是長度,而是結束索引。 http://www.w3schools.com/jsref/jsref_substring.asp

問題2:

通常驗證onBlur過,在我的經驗。

+0

JavaScript有'substr'雖然 – Esailija

+0

@Esailija他的代碼正在使用'String。substring()',所以我只是解釋爲什麼它不像他期望的那樣工作。檢查鏈接。 –

+0

嗯,我只是想把它放在那裏,你可以建議他,而不是試圖找出什麼末尾索引必須在'substring' – Esailija

0

1.)我的第一個答案是錯的;我需要再看一遍。

2.)驗證關鍵點和模糊檢查;你可以設置這兩個的作爲選項params對象

onkeyup: false, 
onblur: false 
0

爲什麼不直接使用正則表達式驗證,然後讓IT擔心客戶端代碼。你可以使用這樣的事情:

<asp:RegularExpressionValidator ID="revTime" ControlToValidate="txtTime" ValidationExpression="[0]{0,1}[1-9]:[0-5][0-9]|[1][0-2]:[0-5][0-9]" ValidationGroup="x" runat="server" ErrorMessage="Not a valid time." /> 

,如果您使用的AjaxControlToolkit,您可以使用其FitleredTextBoxExtender如下篩選編輯:

<ajaxToolkit:FilteredTextBoxExtender ID="fteTime" runat="server" TargetControlID="txtTime" FilterMode="ValidChars" FilterType="Numbers, Custom" ValidChars=":" /> 
+2

這是MVC;這些控件不適用 –