我需要在Web窗體應用程序中驗證日期。爲此,我使用了一個CompareValidator與Firefox上的CompareValidator問題
Operator="DataTypeCheck" Type="Date"
問題是這個驗證器無法在2位數字的Firefox上正常工作。 (javascript錯誤:米[2]是不明確的) 4位數的年份它的工作正常。
有誰知道這一個很好的解決方法嗎?
感謝
我需要在Web窗體應用程序中驗證日期。爲此,我使用了一個CompareValidator與Firefox上的CompareValidator問題
Operator="DataTypeCheck" Type="Date"
問題是這個驗證器無法在2位數字的Firefox上正常工作。 (javascript錯誤:米[2]是不明確的) 4位數的年份它的工作正常。
有誰知道這一個很好的解決方法嗎?
感謝
我的解決方案是創建一個日期驗證從繼承BaseValidator
並覆蓋ControlPropertiesValid(), EvaluateIsValid() and OnPreRender(EventArgs e)
。 如果您有其他想法,請拍攝。
也許這可以幫助你(過去後,僅datatype ==「日期」需要),但我還沒有測試它: http://forums.asp.net/t/1358621.aspx
嗨蒂姆謝謝你的提示。在您指定Rachel建議使用CustomValidator和來自ComparisonValidator的固定java腳本代碼的線程中。我更喜歡創建一個新的驗證器,因爲我可以通過代碼輕鬆地重用它。 – Costin 2010-06-14 07:48:45
這是ASP.NET 3.5及更早版本中客戶端驗證腳本中的一個錯誤。 (該腳本在較舊版本的Internet Explorer中正常工作,但在較新的符合標準的瀏覽器中無法正常工作。)
Microsoft已修復ASP.NET 4.0中的錯誤。
如果您不能升級到ASP.NET 4.0,您可以導出從System.Web.dll的版本中自帶的.NET 4.0的WebUIValidation.js資源,然後在你的頁面的PreRender
註冊事件的腳本:
this.ClientScript.RegisterClientScriptInclude(
typeof(System.Web.UI.WebControls.BaseValidator), "WebUIValidation.js",
"url-to-the-4.0-WebUIValidation.js-script");
或者,您可以通過添加以下到您的網頁上<script type="text/javascript">
塊重載車ValidatorConvert
功能:
function ValidatorConvert(op, dataType, val) {
function GetFullYear(year) {
var twoDigitCutoffYear = val.cutoffyear % 100;
var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;
return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));
}
var num, cleanInput, m, exp;
if (dataType == "Integer") {
exp = /^\s*[-\+]?\d+\s*$/;
if (op.match(exp) == null)
return null;
num = parseInt(op, 10);
return (isNaN(num) ? null : num);
}
else if(dataType == "Double") {
exp = new RegExp("^\\s*([-\\+])?(\\d*)\\" + val.decimalchar + "?(\\d*)\\s*$");
m = op.match(exp);
if (m == null)
return null;
if (m[2].length == 0 && m[3].length == 0)
return null;
cleanInput = (m[1] != null ? m[1] : "") + (m[2].length>0 ? m[2] : "0") + (m[3].length>0 ? "." + m[3] : "");
num = parseFloat(cleanInput);
return (isNaN(num) ? null : num);
}
else if (dataType == "Currency") {
var hasDigits = (val.digits > 0);
var beginGroupSize, subsequentGroupSize;
var groupSizeNum = parseInt(val.groupsize, 10);
if (!isNaN(groupSizeNum) && groupSizeNum > 0) {
beginGroupSize = "{1," + groupSizeNum + "}";
subsequentGroupSize = "{" + groupSizeNum + "}";
}
else {
beginGroupSize = subsequentGroupSize = "+";
}
exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + val.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)"
+ (hasDigits ? "\\" + val.decimalchar + "?(\\d{0," + val.digits + "})" : "")
+ "\\s*$");
m = op.match(exp);
if (m == null)
return null;
if (m[2].length == 0 && hasDigits && m[5].length == 0)
return null;
cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : "");
num = parseFloat(cleanInput);
return (isNaN(num) ? null : num);
}
else if (dataType == "Date") {
var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$");
m = op.match(yearFirstExp);
var day, month, year;
if (m != null && (((typeof(m[2]) != "undefined") && (m[2].length == 4)) || val.dateorder == "ymd")) {
day = m[6];
month = m[5];
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
}
else {
if (val.dateorder == "ymd"){
return null;
}
var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.|\\.)?\\s*$");
m = op.match(yearLastExp);
if (m == null) {
return null;
}
if (val.dateorder == "mdy") {
day = m[3];
month = m[1];
}
else {
day = m[1];
month = m[3];
}
year = ((typeof(m[5]) != "undefined") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));
}
month -= 1;
var date = new Date(year, month, day);
if (year < 100) {
date.setFullYear(year);
}
return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
}
else {
return op.toString();
}
}
我使用ie8或更高版本的ASP.NET 4.0,輸入兩位數日期時仍然出現JS錯誤。我很驚訝沒有更多的帖子。 – pghcpa 2014-04-15 23:58:04
@pghcpa:查看瀏覽器開發人員工具中的驗證腳本。你在'ValidatorConvert'函數中看到對''undefined''的引用嗎? – 2014-04-16 13:46:18
使用自定義驗證
Imports System.Globalization
Private Sub CustomValidator1_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
Dim dateResult As Date
If Date.TryParse(TextBox1.Text, CultureInfo.CreateSpecificCulture("zh-CN"), DateTimeStyles.None, dateResult) Then
args.IsValid = True
Else
args.IsValid = False
End If
End Sub
如果首選的話,可以在JS的客戶端執行等價操作。
我不明白你爲什麼不把你的解決方案發布到你自己的問題上......分享是很有價值的。 – danyim 2012-09-25 13:55:43