0

我試圖實現自定義客戶端驗證,但它不工作。我正在基於Codeproject上的文章http://www.codeproject.com/Articles/275056/Custom-Client-Side-Validation-in-ASP-NET-MVC3ASP.NET MVC 3 - 自定義客戶端驗證不工作

我也看過這裏,但我認爲我正確地實施它,但我忽略了一些東西。 我的目標是驗證一個日期(必需的,日期格式,不要早於表單上的另一個日期)。前兩個可以通過數據註釋來完成,最後一個我需要處理自定義驗證。

我有我的基類的一些dataannotations(ClassLibrary是VB.NET):

Imports System.ComponentModel 
Imports System.ComponentModel.DataAnnotations 

<MetadataType(GetType(CM_CONTRACTVALIDATIONData))> 
Partial Public Class CM_CONTRACTACTIVATION 
    '... 
End Class 

Public Class CM_CONTRACTVALIDATIONdata 
'... 
<DataType(DataType.Date)> 
<Required()> 
Public Property TakeBackDeviceWhen 
'.. 
End Class 

在我已經添加了自定義方法的JavaScript文件:

//validation 
$.validator.addMethod("checkPickupDate", function (value, element) { 
    return false; 
}); 
$("#form").validate({ 
    rules: { 
     TakeBackDeviceWhen: { 
      checkPickupDate: true 
     } 
    }, 
    messages: { 
     TakeBackDeviceWhen: { 
      checkPickupDate: "Test" 
     } 
    } 
} 
); 

我CHTML文件如下:

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "", new { style = "Width: 200px" }) 

產生的HTML是如下:

<input id="TakeBackDeviceWhen" class="hasDatepicker" type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" data-val-required="The TakeBackDeviceWhen field is required." data-val="true"> 

看來,我的類型驗證和我的自定義驗證都沒有實現。

什麼問題?

+0

我一直在尋找這個問題。我最終做了一個測試MVC項目。但它也不起作用。檢查了兩次文章,我想我和他們一直在說的一樣。在這個項目中我沒有日期檢查:http://www.4shared.com/zip/e9eb0Dza/TestMVC.html?refurl=d1url – JurgenStillaert

+0

好的。發現DataType不執行驗證。 Pro ASP。.NET MVC3框架頁面605:「■提示DataType屬性不能用於驗證用戶輸入 - 僅爲使用模板化助手提供值 提供提示(在第16章中描述)。因此,例如,不要期望DataType(DataType.EmailAddress)屬性強制執行特定的格式。「 – JurgenStillaert

+0

當前狀態:(1)不要使用EditorFor,(2)將data_val,data_val_required,data_val_date作爲htmlattribute添加到字段中,(3)DataType註釋不會強制類型驗證。仍堅持添加自定義jQuery驗證器。見http://www.4shared.com/zip/f9G2eNwu/TestMVC2.html – JurgenStillaert

回答

1

好的,解決了。我希望:-)

我今天學到了什麼: (1)不要使用EditorFor:當你從一個MVC模板腳手架中,輸入字段被生成到EditorFor,看起來你不能添加自定義不顯眼的驗證標籤。所以,我試圖解決這個問題,直到我將它改爲TextBoxFor。 (2)您可以在jQuery中添加自定義驗證方法,但是您不能將它們與不顯眼的驗證混合使用。添加自定義方法後,您還必須將其添加到不顯眼的適配器。而且不要忘了添加jQuery的底部:-S(我得到這個從jQuery.validator.unobtrusive.adapters.addMinMax round trips, doesn't work in MVC3

$(function() { 
$.validator.addMethod("checkpickupdate", function (value, element) { 
    if (value == "20/09/2012") { 
     return false; 
    } else { 
     return true; 
    } 
}); 

$.validator.unobtrusive.adapters.addBool("checkpickupdate"); 
} (jQuery)); 

(3)添加驗證標記輸入字段中htmlAttributes:

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "", 
       new { 
        style = "Width: 200px", 
        data_val = "true", 
        data_val_required = "verplicht!", 
        data_val_date = "moet datum zijn", 
        data_val_checkpickupdate = "wow" 
       }) 

( 4)數據類型數據註釋不會執行驗證。你必須像(3)中那樣添加它。你可以添加自定義ValidationAttribute(用於服務器端驗證):

public class MustBeDateAttribute : ValidationAttribute { 
    public override bool IsValid(object value) { 
     try 
     { 
      DateTime dte = DateTime.Parse(value.ToString()); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
      throw; 
     } 
    } 
} 

這是生成的HTML輸出:

<input type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" id="TakeBackDeviceWhen" data-val-required="required!" data-val-date="has to be a date" data-val-checkpickupdate="custom error" data-val="true" class="hasDatepicker valid"> 

正如我用我的ClassLibrary在不同的項目中,我現在要嘗試從類庫中分離dataannotations元數據(可能使用依賴解析器)。