linqをSQLにORMとして渡し、linqをSQLサービスのSQLオブジェクトのaspx UIページに渡します。linqからSQlへの部分クラスがWebサービス経由で渡されない
LinqをSQLオブジェクトに渡すとうまくいきました。シリアル化され、jsonとしてアクセスできます。これらのオブジェクトのデータの中には、いくつかの異なるlinqからSQLクラスに由来するものもあるため、このWebサービスはpoco DTOを渡すとうまく動作します。
問題は、私がしようとしてみて、カスタム部分クラスで定義された余分なフィールドを持つSQLクラスにlinqを使用することです。部分的なクラスの私のカスタム側のフィールドは、Webサービスを介して取得することはありません、部分クラスのSQLの生成側へのlinqのフィールドが出くわす。
オブジェクトを作成するときにフィールドがあり、ビジュアルスタジオデバッガでサービスを見るまでフィールドが表示されますが、反対側の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のページでは、[DataMemberAttribute]
を使用する必要が
<%@ 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&v=2&sensor=true&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);
}
}
}
ありがとう、ええ、私はそれを試みた。しかし、私はページにエラーが発生します。私は火かぶ虫のスクリーンショットを付けました。 –
誰もそれを読むことはできません。 –
申し訳ありませんが、ここに画像への直接のURLです。 http://i.stack.imgur.com/5YkiV.png –