2012-05-01 15 views
3

私はDataContractでToStringメソッドをオーバーライドしていますが、ActivityTypeクラスのActivityType.Codeプロパティ値を返しています。私はまだクライアントにActivityType.Codeプロパティ値を取得していないのですが、Grid.canはクライアントにToStringメソッドをどのように利用できるかを教えてくれます。ここでToStringメソッドWCFのDataContractでオーバーライド

は、コードベースである

データ契約

[DataContract] 
    public class Activity 
    { 
     [DataMember] 
     public ActivityType ActivityTypeId { get; set; } 
     [DataMember] 
     public string Code { get; set; } 
     [DataMember] 
     public string Description { get; set; } 
     [DataMember] 
     public EntityStatus Status { get; set; } 

    } 
    [DataContract] 
    public enum EntityStatus 
    { 
     [EnumMember] 
     Active = 0, 
     [EnumMember] 
     Inactive = 1 
    } 

    [DataContract] 
    public class ActivityType 
    { 
     [DataMember] 
     public string Code { get; set; } 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Description { get; set; } 

     public override string ToString() 
     { 
      if (Code != null) 
      { 
       return Code.ToString(CultureInfo.InvariantCulture); 
      } 
      else 
      { 
       return base.ToString(); 
      } 
     } 
    } 

サービス実装

public class TimeSheetManagementService : ITimeSheetManagementService 
    { 
     public List<BusinessEntities.Activity> GetActivities() 
     { 
      TimeSheetManagementDataController controller = new TimeSheetManagementDataController(); 


      var activities = controller.GetActivities(); 
      var activitiesresult = activities.Select(activity => new BusinessEntities.Activity() 
                    { 
                     ActivityTypeId = 
                      new BusinessEntities.ActivityType() 
                       { 
                        Code = activity.ActivityType.Code, 
                        Description = 
                         activity.ActivityType. 
                         Description, 
                        Name = activity.ActivityType.Name 
                       }, 
                     Code = activity.Code, 
                     Description = activity.Description, 
                     Status = (EntityStatus) Enum.Parse(typeof(EntityStatus),Convert.ToString((activity.Status==true)?1:0)) 
                    }); 

      return activitiesresult.ToList(); 
     } 
    } 

クライアント実装

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> 
      <Columns> 
      <asp:BoundField runat="server" DataField="Code"/> 

      <asp:BoundField runat="server" DataField="Description"/> 

      <asp:BoundField runat="server" DataField="Status"/> 

      <asp:BoundField runat="server" DataField="ActivityTypeId"/> 
      </Columns> 
     </asp:GridView> 

出力

Code Description     Status ActivityTypeId 
    ACT2 Requirement Feasibility Study Inactive TimeSheetManagementServiceRef.ActivityType 
    ACT1 Requirement analysis Inactive  TimeSheetManagementServiceRef.ActivityType 
+0

重複質問:http://stackoverflow.com/questions/1181039/wcf-datacontract-tostring-functionとhttp://stackoverflow.com/questions/1133063/wcf-datacontract-class-with-methodsを見ます – Styxxy

+0

参考にしてくれてありがとうございましたが、これらのリファレンスソリューションはプロキシクラスを持っているべきだと言いますが、私はXSDファイルを作成したウェブサイトプロジェクトでサービスリファレンスを作成したときにSvcUtil.exeを使用してプロキシクラスを明示的に作成する必要があります。サービス参照の設定時にVisual Studio 2010自体を使用して生成することはできません。提案してください – sameer

+0

私は通常、それらの契約でクラスライブラリを作成し、サービスとアプリケーションの両方でこのクラスライブラリを参照するだけです。 – Styxxy

答えて

6

データコントラクトは、データの転送用であり、ロジックの転送用ではありません。サービス参照の追加、Web参照の追加、xsd.exe、wsdl.exeまたはsvcutil.exeを使用すると、サーバー上で宣言されたすべてのメソッドが失われます。これを解決する方法は2つあります。

  • 醜い方法:
  • これらのツールが作成する必要があります言及したツールの1つを介してクライアント上で新しいタイプを作成するサービスとクライアント間でデータコントラクトを持つライブラリを代わりに共有します部分クラス。 ToStringメソッドは明らかにクライアント側に属しています。これはデータプレゼンテーションに関連しているため、クライアント側でコントラクトクラスの第2部分部分を作成し、そのクラスにToStringメソッドを宣言します。
関連する問題