2013-10-14 21 views
0

需要一個複雜類型的屬性我無法弄清楚如何「定製」的規則爲[Required]屬性,當我堅持到自定義類型的屬性。代碼如下所示:請在MVC4形式

public class MyProp 
{ 
    public Guid Id {get;set;} 
    public string Target {get;set;} 
} 
public class MyType : IValidatableObject 
{ 
    public string Name {get;set;} 
    public MyProp Value {get;set;} 

    private MyType() 
    { 
     this.Name = string.Empty; 
     this.Value = new MyProp { Id = Guid.Empty, Target = string.Empty }; 
    } 
    public MyType(Guid id) : this() 
    { 
     this.Value.Id = id; 
     // Fill rest of data through magic 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(this.Value.Id == Guid.Empty) 
      yield return new ValidationResult("You must fill the property"); 
    } 
} 

該模型在表單中顯示出來(通過自身EditorTemplate)作爲一個按鈕,允許選擇從列表的文本框(後備數據是動態CRM 2011環境,而這模型實際上旨在表示查找屬性)。

public class MyModel 
{ 
    // Many props 

    [Required] // This one is enforced correctly 
    public string MyString {get;set;} 

    [Required] // This one isn't 
    public MyType MyData {get;set;} 

    public MyModel() { this.MyData = new MyType(); } 
} 

結果視圖顯示字段(當然是空的)。用戶只能通過點擊字段,然後從列表中選擇輸入數據(一個jQuery對話框照顧這一點,它已經工作)。

IValidatableObject接口聽起來很有前途,但該代碼似乎並沒有被永遠調用。

在控制器中,我只是在做

[HttpPost] 
public ActionResult MyAction(FormCollection data) 
{ 
    if (!ModelState.IsValid) return View(); 
    // magic: handle data 
} 

我缺少什麼?我可能誤解了IValidatableObject接口的用法?

+0

也許這可能會幫助你:http://stackoverflow.com/questions/3400542/how-do-i-use-ivalidatableobject – Silvermind

+0

我忘了代碼的控制器部分,修正了問題。目前正試圖實現鏈接後的想法。 – Alex

回答

1

你的控制器動作應該採取的視圖模型參數,而不是弱類型FormCollection這完全沒有關係模型(和它的驗證規則):

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(); 
    } 

    // magic: handle model 
} 

現在默認的模型綁定將是爲了從請求中綁定視圖模型並評估您在此模型中可能具有的任何驗證邏輯而被調用。

你怎麼從你的代碼,ASP.NET MVC,希望你永遠不知道你是這個MyModel類的工作?你絕對沒有在你的POST動作中使用過它,所以你不能指望它有任何驗證。

一旦你開始使用,你應該忘記弱類型的集合,例如FormCollection,並開始與視圖模型工作視圖模型。

+0

'MyModel'還包含'string'屬性,它們按照預期進行了驗證,非基類型的行爲是否有所不同? – Alex

+0

我不太明白你的意思。順便說一句,你不應該混合數據註解的屬性(如'[必填]')和'IValidatableObject'實施。那些是相互排斥的。您應該決定使用哪種驗證方法。 –

+0

只是一個方面的問題/評論,但不是這樣,使用IValidatableObject更適合自定義JavaScript驗證?我記得在StackOverflow上有關於jquery.validation.js – Silvermind