2012-05-01 25 views
3

即使通過返回ActivityType類中的ActivityType.Code屬性值,我在DataContract中覆蓋了ToString方法。我仍然沒有在客戶端上綁定grid.can的ActivityType.Code屬性值,讓我知道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屬性會被描述 - 您在服務器上聲明的所有方法都將丟失。有兩種方法來解決這個問題:

  • 醜陋的方式:通過對提到的工具
  • 這些工具應該創建一個共享服務和客戶端之間的數據契約的庫,而不是建立在客戶機上的新型部分班級。您的ToString方法顯然屬於客戶端,因爲它與數據表示有關,因此在客戶端上創建合同類的第二部分並在該類中聲明ToString方法。