2014-10-20 79 views
2

我是新來的MVC.NET,似乎無法理解爲什麼我的驗證函數沒有被調用,它位於MyModel類中。驗證方法沒有在視圖模型內部的模型上調用

爲MyModel:

Public string Name { get; set; } 
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
// validation logic which is not being called on post. 
} 

當我發帖的形式,實際上,我張貼我的ViewModel具有爲MyModel的一個屬性。

視圖模型:

Public MyModel { get; set; } 

控制器:

[HttpPost] 
public ActionResult Index(ViewModel model) 
{ 
    // this is always true?? 
    if(this.ModelState.IsValid) { blah blah } 
} 

它總是真實的原因是因爲內部爲MyModel我驗證邏輯沒有被從視圖模型上的POST調用。

這可能是一個noob問題,但我不知道。謝謝你的幫助。

+1

我沒有時間發佈代碼,對不起,但看着「自定義模型粘合劑」。爲'ViewModel'創建一個自定義模型綁定器,當'public ActionResult Index(ViewModel model)'被調用時執行。在自定義模型聯編程序中,您將能夠調用驗證方法。 – 2014-10-20 18:08:39

+1

只是擴大Jason的評論,[這SO帖子](http://stackoverflow.com/questions/6431478/how-to-force-mvc-to-validate-ivalidatableobject)應該給你一個想法如何去與'自定義式樣黏結劑'。 – Michael 2014-10-20 18:23:16

+0

嗯,這不是MVVM - 它是MVC。你的「ViewModel」是一個模型。控制器是...控制器。而cshtml文件是視圖。模型 - 視圖 - 控制器。用於Web應用程序的MVVM框架通常位於客戶端。 Angular和Knockout是MVVM客戶端框架的兩個例子。 – Will 2014-10-20 18:58:16

回答

2

感謝您的回覆。其實我跟一個同事誰告訴我,爲了得到視圖模型發佈和具有在視圖模型引用的類驗證拿的地方,我需要從IValidatableObject

public class MyModel : IValidatableObject 

繼承比我只需要需要將ValidationContext validationContext傳遞給Validate方法。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
} 

它的工作!它在發佈ViewModel時調用了MyModel的驗證方法。

+0

我看到這正是邁克爾在提供的鏈接中所談論的。 – 2014-10-20 18:29:51

0

您也可以查看DataAnnotations以瞭解您的驗證要求;它可能會導致在您的模型中更清潔的代碼:

using System.ComponentModel.DataAnnotations; 

[Required(ErrorMessage="Please supply a Name")] 
[RegularExpression(@"^([A-Za-z]{1,50}$")] 
Public string Name { get; set; } 

...例如。

相關問題