2012-04-05 58 views
0

我在asp.net web服務,我有這個模型返回:如何僅顯示Web服務結果中的一些字段?

[Seriazable] 
public class Package { 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string List<Document> Documents { get; set; } 

    public Package() { } 
} 

而且在我的web服務,我有以下方法:

[WebMethod] 
public Package GetPackage(int Id); 


[WebMethod] 
public List<Package> FindPackage(); 

第一種方法是確定的(全屬性返回,它工作正常),但第二個方法,我不想公開的文件屬性,只有Id和Name ...我怎麼能做到這一點?

謝謝

回答

2

既然你不想消費客戶機能夠訪問這些文件,你應該創建一個獨立的視圖模型類的第二種方法服務。事情是這樣的:

public class SimplePackageViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

然後,您可以使用一些映射工具,例如AutoMapper實例化這個類的對象,並返回那些代替:

[WebMethod] 
public List<SimplePackageViewModel> FindPackage(); 
[WebMethod] 
public Package GetPackage(int id); 

Karel Frajtaksuggested您使用了類似的觀點模型對象也但是因爲它們是相同的,只會混淆你的代碼 - 只要Package是一個簡單的POCO,就不需要額外的類。但是,如果您使用的是跟蹤Package實例的O/R映射器,最好將它們暴露給客戶端應用程序。然後,您應該按照Karel的建議進行操作,併爲Package創建一個POCO視圖模型類。


1)一些叫他們數據傳輸對象(DTO)。我稱他們爲視圖模型。我敢打賭,還有另外十個名字 - 實際上,它們都是一樣的。

+0

感謝Tomas Lycken,其實,我知道如何應用DTO(或ViewModel),但我認爲有沒有這些方法可以做到這一點對象。我的課程沒有使用ORM工具進行映射!乾杯! – 2012-04-05 12:19:11

2

僅使用所需的屬性創建數據傳輸對象。

第一種方法將返回PackageDTO,與Package的比例爲1:1。 第二個將返回PackageLightDTO,那將只包含IdName屬性。

0

我將我的方法改變這樣的事情:

[Seriazable] 
public class Package { 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public Package() { } 
} 


[Seriazable] 
public class PrivatePackage : Package{ 

    public string List<Document> Documents { get; set; } 

} 


[Seriazable] 
public class PublicPackage : Package { 


} 


[WebMethod] 
public Package GetPackage(int Id); 

[WebMethod] 
public PublicPackage GetPublicPackage(int Id); 

[WebMethod] 
public PrivatePackage GetPublicPackage(int Id); 


[WebMethod] 
public List<PrivatePackage> FindPrivatePackage(); 

[WebMethod] 
public List<PublicPackage> FindPublicPackage(); 
+0

如果客戶端使用錯誤的方法,這仍會暴露包列表上的'Documents'屬性。 – 2012-04-05 12:12:25

+0

因此,如果他不希望暴露在包裹上的文件只是刪除合同... – RollRoll 2012-04-05 12:15:35

相關問題