2011-02-10 16 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が返さ:私は匿名型は全く__TYPE属性を生成しないオブジェクトとして返さことに気づいた

{"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

なぜ気になりますか?あなたはそれを無視できませんか? –

+1

もちろん、JSONを使うのは、オブジェクトをできるだけ軽くすることです。その余分な属性は、私のオブジェクト上の余分な重量です。 –

+0

@Groxx:本番環境では「スタックトレースをダンプする」ことをお勧めします。本番環境でバグのあるコードを実行するのではなく、エラーを見つけることができます。 –

答えて

3

OK私はJhon Morrisonの助言を受けて、@ Kid linked 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

。私は別の理由でこのような私のオブジェクトのいくつかを返していたし、Javascriptは気にしない、それは匿名型が大好きです。だから、私は、他の多くの型を、すべてのオブジェクトが継承する基本オブジェクトに変換することを開始すると思います。私は強い型を渡すのが好きで、最後まで変換したくないので、サービスレイヤーはこれを処理します。このキャスティングには時間がかかりますか?多分。その価値はありますか?まあ、私は知らない。私はこの情報がセキュリティ上の理由からそこにあるべきではないということに同意します。マイクロソフトに問い合わせてください。

+0

これは最良の解決策であるかもしれません。使用しているPOCOとまったく同じフィールドを含む匿名型を返す例を挙げることはできますか? –

+0

私は今日それをもっとうんざりしています。私はそれがはるかに作成し、維持することになるすべてを変換するつもりはありません。別の方法があるはずです。私の答えは不明であることがわかった、ここに例がある...あなたのオブジェクトを複製する匿名オブジェクトを作成し、それを型オブジェクトにキャストし、これを返す...オブジェクトreturnValue =(オブジェクト)new {Property1 = myObject.Property1 、Property2 = myObject.Property2};ご覧のように、匿名オブジェクトから作成されたオブジェクトを返します。したがって、匿名オブジェクトの名前空間には存在しません。 – Kid

+0

このプロセスを自動化するメソッドを記述できますか? – Kid

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 
} 
関連する問題