2010-08-17 63 views
2

我想使用DataAnnotations進行MVC ViewModels的基本客戶端和服務器端驗證。我的視圖模型看起來是這樣的:如何使用DataAnnotations進行ASP.NET MVC模型驗證其中ViewModel包含來自外部Web服務的對象?

public class MyViewModel 
{ 
    public Client Client1 { get; set; } 
    public Client Client2 { get; set; } 
    public Product Product { get; set; } 
} 

所以我想檢查兩個客戶對象有一個名字和電話號碼,產品對象具有有效的數字價格等

我的問題是, ClientProduct都是Visual Studio從Web服務生成的代理類型,所以我不能直接將註釋屬性添加到其所需的屬性中。

我讀過using the MetadataType attribute指定的替代類中的元數據(具有重複屬性),但在這種情況下,我甚至不能將該屬性添加到ClientProduct類。

或者我能嗎?在保存我的VS解決方案的Web References文件夾中,存在一個名爲Reference.cs的Web服務名稱空間的文件夾,其中包含代理類型的VS生成代碼。

如果我將元數據添加到這裏的類中,這是否會工作 - 或者正在搞亂生成的代碼是一個非常糟糕的主意?還是隻有一個更簡單,更清潔的方式來做到這一點?

回答

3

經過一番狩獵後,我發現這實際上非常簡單 - 這只是我不知道要搜索什麼的情況!

你實際上並不需要的MetadataType屬性添加到類的定義:您可以將其添加到空部分類相同類型的(請確保您的局部類是在同一個命名空間爲原類型)。

然後你只需創建一個包含您的驗證規則「夥伴」類,你通常會:

using System.ComponentModel.DataAnnotations; 

namespace WebServiceNamespace 
{ 
    [MetadataType(typeof(ClientMetaData))] 
    public partial class Client 
    { 
    } 

    public class ClientMetaData 
    { 
     [Required(ErrorMessage = "Please enter a name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage="Please enter a telephone Number")] 
     public string Telephone { get; set; } 
    } 
} 

這工作完全與標準模型綁定,無需訪問原始代碼的類型,所以您可以使用DataAnnotations輕鬆設置驗證規則,即使對於不屬於您的代碼庫的類型也是如此。

0

只要您不重新生成並修改修改,修改生成的代碼就可以工作。除了在有人生成引用時丟失工作的機會之外,沒有理由不能將元數據引用添加到代理類。

另一種方法是使用自定義驗證,或者創建一個模型,然後將這些字段映射到代理對象。創建一個不基於Client對象的模型將是最安全的方法。

相關問題