2012-04-25 51 views
5

我一直在使用與ASP.NET剃刀MVC模式剛剛起步,一切都很好!爲驗證該模型說明看了第一個偉大的,但現在它變得很煩人的,因爲似乎沒有被驗證複選框的直線前進的方式,它似乎是一個痛苦與模型沿着自己的jQuery驗證集成到一個表單驗證。似乎通過在模型asp.net添加註釋,爲你做的工作,這是偉大的,但是當它歸結爲自定義網站的我什麼都不想預先完成。 所以,最好是使用JQuery用自己的驗證去還是堅持在模型中使用的註解?ASP.NET MVC - 是它更好地使用自定義的jQuery驗證,而不是使用型號註解?

感謝

+0

我只能談論我...我preffer模型註釋。 – 2012-04-25 14:20:31

+0

您是否認爲使用JQuery的靈活性比使用C#代碼的模型更具靈活性? – Funky 2012-04-25 14:21:15

+1

您需要客戶端驗證以及服務器端驗證。 – 2012-04-25 14:22:00

回答

8

客戶端,只驗證是從安全角度來看,大錯。在服務器端明確驗證;如果兩者都很痛苦,請刪除客戶端驗證。

模型驗證與MVC3相伴隨而來,可能比您賦予它更多的靈活性。

例如,你可以實現你的模型,需要定義這個方法的IValidatableObject:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 

可以在其中放置各種驗證規則,以你的心臟的內容,包括基於規則多個輸入值的組合(例如密碼和password_repeat必須相等)

1

我更喜歡模型註釋。任何jQuery驗證,你可能有你也想作爲一個模型註釋,以確保有人沒有得到你的jQuery驗證通過禁用JavaScript或黑客入侵...

我發現最簡單的方法添加複選框驗證以及其他自定義的驗證將使用CustomValidationAttribute如下所述:

http://weblogs.asp.net/peterblum/archive/2009/12/07/the-customvalidationattribute.aspx

例子:

[CustomValidation(typeof(Category), "FinalCheck")] 
public partial class Category 
{ 
    [CustomValidation(typeof(Category), "TestCategoryName")] 
    public string CategoryName { get; set; } 

    public bool Active { get; set; } 

    public bool ShowOnHomepage { get; set; } 

    public static ValidationResult FinalCheck(Category pCategory, ValidationContext pValidationContext) 
    { 
     if (!pCategory.Active && pCategory.ShowOnHomepage) 
     return new ValidationResult("The category must be active in order to show it on the homepage.", new List<string> { "Active", "ShowOnHomepage" }); 
     return ValidationResult.Success; 
    } 

    public static ValidationResult TestCategoryName(string pNewName, ValidationContext pValidationContext) 
    { 
     if (Regex.IsMatch(pNewName, @"^\d")) 
     return new ValidationResult("Cannot start with a digit", new List<string> { "CategoryName" }); 
     return ValidationResult.Success; 
    } 
} 
2

什麼是最importan t是你有服務器端驗證。您不必使用數據註釋:您可以嘗試使用其他方法進行驗證,例如實施IValidatableObject,或者集成其他驗證框架。

根據我的經驗,數據註釋(連同不顯眼的驗證庫)提供了一種簡單和可擴展的方式,將服務器端規則鏈接到客戶端實現,而不是在不同的地方定義相同的規則。

如果你想在客戶端驗證顯式控制(但仍希望數據標註的服務器上如何操作),那麼你可以禁用javascript的適配器(此基礎上增加呈現您的輸入數據 - 屬性客戶端驗證規則字段),並手動實施客戶端規則。

但是很難理解爲什麼你要這樣做,當所有的適配器正在做的事情是將服務器端規則(可能是自定義的,可能不是)連接到它的客戶端等效。

相關問題