2012-01-06 45 views
1

ASP.NET MVC3/Razor新手問題:爲什麼不自定義驗證工作?

我正在設置一個自定義驗證模型。儘管我用[Required][RegularExpression(...)]之類的東西裝飾的屬性按預期執行,但我發現自定義驗證不起作用。我讓我的模型執行IValidatableObject,我可以在Validate()方法中找到一個斷點,並觀察執行yield return new ValidationResult(...);的方法 - 但表單仍然發佈。

有一些祕密開關,我失蹤了嗎?

+2

你是指客戶端,對嗎?如果是,那麼你有沒有在視圖中包含驗證腳本 – 2012-01-06 13:10:14

+0

你能顯示你的代碼嗎? – 2012-01-06 14:00:37

回答

1

當您使用IValidatableObject驗證模型屬性時,表單將被張貼。作爲Joeri JANS說,你仍然可以防止這種情況,你的操作方法在返回頁面給用戶:

public ActionResult MyAction(MyModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // code to perform action when input is valid 
     return [return something] 
    } 
    return View(model); // re-display form because ModelState.IsValid == false 
} 

如果您希望自定義驗證,以防止被貼在表格,你需要驗證客戶端。最簡單的方法是使用RemoteAttribute。

public class MyModel 
{ 
    [Remote("MyValidateAction", "MyController", HttpMethod = "POST")] 
    public string MyProperty { get; set; } 
} 

你仍然可以保持IValidatableObject你的代碼,並從一個操作方法驗證它像這樣:

[HttpPost] 
public virtual JsonResult MyValidateAction(string myProperty) 
{ 
    var model = new MyModel{ MyProperty = myProperty, }; 
    var results = new List<ValidationResult>(); 
    var isValid = Validator.TryValidateObject(model, 
     new ValidationContext(model, null, null), results, true); 
    return isValid 
     ? Json(true) 
     : Json(results[0].ErrorMessage); 
} 

以上操作方法做幾乎同樣的事情作爲默認的模型粘合劑。它構建你的視圖模型的一個實例,然後驗證它。所有的驗證規則都會被檢查,包括你的IValidatableObject代碼。如果需要將更多屬性發送到構建視圖模型的操作方法,則可以使用RemoteAttribute的AdditionalFields屬性進行操作。

希望這會有所幫助。

+0

+1並回答信用以獲得全面的答案。謝謝! – 2012-01-07 19:07:42

2

如果您在談論服務器端驗證,您是否有ModelState.Isvalid檢查? http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

+1

這不是一個答案,這是一個問題。問題的評論部分的問題會更好。 – Dangerous 2012-01-06 14:13:21

+0

@危險 - 公正的評論,但無論如何指出我失蹤。 – 2012-01-07 19:07:21

+0

@危險我把它放在這裏,因爲我沒有看到對這個問題發表評論的選項。 – JoJa 2012-01-09 14:43:59

相關問題