2011-10-20 23 views
1

我使用linq to SQL作爲我的ORM,然後將linq to Sql對象跨Web服務傳遞到我的aspx UI頁面。Linq to SQl部分類不通過Web服務

這一直工作正常,當我直接將Linq傳遞給sql對象時,他們得到序列化,我可以作爲json訪問他們。而且,當我傳遞poco DTO時,這個web服務也可以正常工作,因爲這些對象中的一些數據來自幾個不同的linq到SQL類。

我遇到的問題是當我嘗試使用linq到SQL類中定義的額外字段在自定義部分類中。部分類的自定義側的字段沒有通過Web服務,部分類的linq到sql生成側的字段確實碰到了。

當我創建對象時,字段就在那裏,我可以在visual studio調試器中看到它們,直到它們穿過服務,但它們不在另一端的json中。

下面是部分類

using System.Runtime.Serialization; 

namespace GPSO.ATOMWebDataLayer.LinqToSql 
{ 
    public partial class Geofence 
    { 
     public string FillColor { get; set; } 
    } 
} 

這裏是Web服務

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Linq; 
using System.Net; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.ServiceModel.Web; 
using System.Text; 
using System.Web; 
using System.Web.Profile; 
using System.Web.Security; 
using System.Xml; 
using GPSO.ATOMWebBusinessLayer; 
using GPSO.ATOMWebDataLayer; 
using GPSO.ATOMWebDataLayer.LinqToSql; 
using GPSO.ATOMWebDataLayer.Objects; 
using GPSOnline.ReportWebService; 

using Contact = GPSO.ATOMWebDataLayer.LinqToSql.Contact; 
using Event = GPSO.ATOMWebBusinessLayer.Event; 
using Geofence = GPSO.ATOMWebBusinessLayer.Geofence; 

namespace GPSOnline 
{ 
    [ServiceContract(Namespace = "GPSOnline")] 
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class ATOMWebService 
    { 
     private string _atomDbConnectionString; 
     private string _aspNetDbConnectionString; 
     private string _satelliteDbConnectionString; 

     [OperationContract] 
     [WebGet] 
     public IEnumerable<GPSO.ATOMWebDataLayer.LinqToSql.Geofence> GetAllGeofences() 
     { 
      NoCache(); 

      var geofenceRepo = new GeofenceRepository(GetConnectionString()); 
      return geofenceRepo.GetAllGeofences().ToList(); 
     } 
    } 
} 

and here is the Repository 

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using GPSO.ATOMWebBusinessLayer; 
using GPSO.ATOMWebDataLayer.LinqToSql; 
using GPSO.MapUtilities; 
using GPSO.Repository; 
using Microsoft.SqlServer.Types; 
using Geofence = GPSO.ATOMWebBusinessLayer.Geofence; 

namespace GPSO.ATOMWebDataLayer 
{ 
    public class GeofenceRepository 
    { 
     private static string _connectionString = ""; 

     public GeofenceRepository(string connectionString)   
     { 
      _connectionString = connectionString; 
     } 
     public IEnumerable<LinqToSql.Geofence> GetAllGeofences() 
     { 
      var dataContext = new AtomWebDataContext(_connectionString); 
      return allGeofences = dataContext.Geofences.ToList();  
     } 
} 

這裏是UI頁面

<%@ Page Language="C#" MasterPageFile="~/Private/ATOMWEB.master" AutoEventWireup="true" 
    Async="true" Inherits="GPSOnline.Assets" Title="ATOM®web Asset Map" CodeBehind="Assets.aspx.cs" %> 

<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 
<%@ Register Src="../UserControls/ucAssetPicker_ClientEvent.ascx" TagName="ucAssetPicker" 
    TagPrefix="uc1" %> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderLeft" runat="Server"> 
    <asp:ScriptManagerProxy ID="ScriptManagerProxy" runat="server"> 
     <Services> 
      <asp:ServiceReference Path="/ATOMWEBService.svc" /> 
     </Services> 
     <Scripts> 
      <asp:ScriptReference Path="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;client=gme-gpsonline" /> 
      <asp:ScriptReference Path="~/scripts/MapPanel.js" /> 
      <asp:ScriptReference Path="~/scripts/jquery-1.3.2.min.js" /> 
      <asp:ScriptReference Path="~/scripts/AssetLabel.js" /> 
      <asp:ScriptReference Path="~/scripts/NumberFormatting.js" /> 
      <asp:ScriptReference Path="~/scripts/DateFormatting.js" /> 
      <asp:ScriptReference Path="~/scripts/Utilities.js" /> 
      <asp:ScriptReference Path="~/scripts/geofences.js" /> 
      <asp:ScriptReference Path="~/scripts/mapUtilities.js" /> 
     </Scripts> 
    </asp:ScriptManagerProxy> 
    <script type="text/javascript"> 
     var map = null, 
      atomWebServiceProxy = null, 
      selectedAssetId = null, 
      userPreferences = null, 
      userId = null, 
      assets = [], 
      assetMarkers = [], 
      updatedAssets = [], 
      assetStatusPanel = null, 
      assetContextItem = null, 
      trackAsset = false, 
      firstTime = true, 
      deviceChannels = { }, 
      assetPanelLayouts = { }, 
      geoFences = { }; 

     function contentPageLoad() { 
      atomWebServiceProxy = new GPSOnline.ATOMWebService(); 
     } 

     /// <summary> 

     /// <summary>   
     /// calls the webservice to get all the geo fences. 
     /// Runs gotGeoFences when service call successfull 
     /// </summary> 
     function getGeofences() { 
      atomWebServiceProxy.GetAllGeofences(gotGeofences);   
     } 


     /// <summary> 
     /// Add the collection of geoFences to the page  
     /// </summary>   
     /// <param name="Result"> A collection of GeoFences </param> 
     function gotGeofences(result) { 

      geoFences = new GeoFencesObj(map, result, "chkToggleGeofences", "<%=RadContextMenuGotoGeofence.ClientID%>", !userPreferences.DefaultShowGeofences); 

      if (userPreferences.DefaultLocationType == 2 && userPreferences.HomeSiteId != null) { 
       geoFences.zoomToGeofence(userPreferences.HomeSiteId); 
      } 
     } 
} 

回答

0

您需要使用[DataMemberAttribute]

namespace GPSO.ATOMWebDataLayer.LinqToSql 
{ 
    [DataMember] 
    public partial class Geofence 
    { 
     public string FillColor { get; set; } 
    } 
} 
+0

謝謝你,是的,我試過了。但是我在頁面上發生錯誤。我附上了螢火蟲的屏幕截圖。 –

+0

沒有人可以閱讀。 –

+0

對不起,這裏是圖片的直接鏈接。 http://i.stack.imgur.com/5YkiV.png –