2011-02-10 53 views
1

我正在使用從客戶端腳本調用的.net腳本服務,它的工作原理非常好。.net腳本Web服務:__type屬性

唯一的問題是它會爲每個返回的對象生成一個'__type'屬性,這是我不需要或不需要的。
我見過這個幾個帖子在網上,而據我所知,只有「變通」這個:

  • 一些人建議躲在參數少c'tor返回類型爲'內部保護',

  • 其他人建議不要使用[ScriptMethod]標記,而是用JSON手動輸出結果並返回一個字符串。

我想知道是否有另一個更好的解決方案。順便說一句,這個屬性用於什麼呢?
我附上了服務方法和生成的JSON。

方法:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] 
public IEnumerable<EmployeePO> GetEmployeesForDepartment(int DepartmentId) 
{ 

     return new AdministrationController().GetEmployeesForDepartment(DepartmentId); 

} 

JSON返回:

{"d":[{"__type":"Application.Controllers.PresentationObjects.EmployeePO","Positions":[{"__type":"Application.Controllers.PresentationObjects.PositionPO","Id":4,"Name":"Employee: 1test Position 1","IsPriority":false,"WarningThreshold":50,"CriticalThreshold":60,"CurrentWaitingTime":-1,"Passengers":[],"Qualifications":[... 
+0

你爲什麼在意?你不能忽略它嗎?當然是 – 2011-02-13 00:37:42

+1

,但使用JSON的重點在於讓對象儘可能輕。這額外的屬性只是我的對象額外的重量。 – 2011-02-13 07:45:05

回答

3

行,所以我結束了從JHON莫里森採取諮詢,張貼在@Kid鏈接TO-
我定義我返回類的所有參數少的構造函數作爲受保護的內部,並且確實的伎倆問題。
在我實際需要創建我創建了一個工廠方法,像這樣空物體的情況:

public class MyClass 
    { 
     public int Id { get; set; } 
     /*...*/ 

     public MyClass(int id): 
     { 
      Id = id; 
     } 


     public static MyClass CreateNewZonePO() 
     { 
      return new MyClass(); 
     } 

     //parameterless c'tor for serialization's sake 
     //it's protected internal in order to avoid the "__type" attribute when returned from a web service. see http://stackoverflow.com/questions/4958443/net-script-web-services-type-attribute 
     protected internal MyClass() 
     { 

     } 
    } 

@孩子的回答也工作了,但它看起來更清潔,以我這樣。

2

我注意到,匿名類型返回的對象不產生__type屬性都沒有。由於不同的原因,我已經返回了一些這樣的對象,JavaScript不關心,它喜歡匿名類型。所以我想我會開始轉換許多其他類型將它們轉換爲所有對象繼承的基礎對象。服務層將處理此問題,因爲我喜歡傳遞強類型,並且不希望將其轉換爲最後一分鐘。這個演員是否需要時間?大概。這值得麼?哎呀,我不知道。我同意,爲了安全起見,這個信息不應該在那裏。來吧微軟。

0

如果將返回類型從IEnumerable<EmployeePO>更改爲IEnumerable<Object>__type字段將不會添加到JSON字符串中。

0

我做了一點不同,對我來說是一個小清潔劑。 (我沒有試圖從以前的答案中拿走,只是試圖增加/減少所需的編碼量。)

public class MyClass 
{ 
    private MyClass(int id) { } //needs to have a constructor with at least one parameter passed to it. Update: looks like this is not needed. I still need to test this some more though. 

    protected internal MyClass() { } //this actually drives the restriction on the JSON return of the __type attribute and is an overload constructor 
}