Javascript WCF响应在ASP.NET WebForms中作为Json,使用Json.NET
我使用的是一个WCF服务,我想用一个对象列表来响应它。由于我的对象是由entity framework生成的,所以我无法真正返回列表,因为它有一些循环引用,并且默认序列化失败。因此,我使用匿名类型创建一个只包含我需要的属性的对象列表。 这就是我使用Json.NET所做的:Javascript WCF响应在ASP.NET WebForms中作为Json,使用Json.NET,javascript,wcf,json.net,webforms,Javascript,Wcf,Json.net,Webforms,我使用的是一个WCF服务,我想用一个对象列表来响应它。由于我的对象是由entity framework生成的,所以我无法真正返回列表,因为它有一些循环引用,并且默认序列化失败。因此,我使用匿名类型创建一个只包含我需要的属性的对象列表。 这就是我使用Json.NET所做的: [OperationContract] public string DoWork() { using (X ent = new X()) {
[OperationContract]
public string DoWork()
{
using (X ent = new X())
{
var modules = from p in ent.Modules select new { Name = p.Name, Value = p.ID };
return JsonConvert.SerializeObject(modules);
}
}
现在,这是我的javascript,它在表中呈现结果:
function btn_onclick() {
var srv = new DDSProjectManagement.ProjectsService();
srv.DoWork(Res, null, null);
}
function Res(dataList) {
var divObj = document.getElementById('tablePos');
var name = 'Name';
var desc = 'Description';
var tableStart = '<table><tbody><tr><th>Name</th><th>Description</th></tr>';
var tableContent = '';
var tableEnd = '</tbody></table>';
for (var i = 0; i < dataList.length; i++) {
tableContent += '<tr><td>' + dataList[i].Name + '</td><td>' + dataList[i].Value + '</td></tr>';
}
divObj.innerHTML = tableStart + tableContent + tableEnd;
}
函数btn\u onclick(){
var srv=新的DDSProjectManagement.ProjectsService();
srv.DoWork(Res,null,null);
}
函数Res(数据列表){
var divObj=document.getElementById('tablePos');
变量名称='name';
var desc=‘说明’;
var tableStart='namescription';
var tableContent='';
var tableEnd='';
对于(var i=0;i
如果我这样做,javascript获取的参数只是一个字符串,它无法将其视为对象列表。当然,它应该是一个Json字符串,我可以尝试解析它,以便它从中提取对象。但是我真的想使用javascript,就像现在一样,修改服务。例如,在以下情况下更改我的服务就可以了:
public List<SimpleObject> DoWork()
{
return new List<SimpleObject>() { new SimpleObject("Florin", 1), new SimpleObject("Andrei", 2) };
}
public List DoWork()
{
return new List(){new SimpleObject(“Florin”,1),new SimpleObject(“Andrei”,2)};
}
SimpleObject不是EntityFramework对象,因此这没有问题。我假设默认序列化程序是Json序列化程序,javascript应该获得基本相同的参数:Json字符串
所以我的问题是,如何让我的方法向我的JS发送匿名类型对象列表,因为通过Json.NET构建字符串不起作用?
提前谢谢。调查。。。它将允许您从服务器端将信息推送到JavaScript。我做了一些类似的事情,在我的ASP.NETMVC3页面上有一个WCF服务,然后每当我的服务收到数据时,我就把它推到我的JavaScript上
我的服务将信息发送给我的信号员“调解人”:
public void Message(string messagePacket)
{
new NotificationMediator().NotifyClients(messagePacket);
}
在我的例子中,我只是新建了一个新的中介(signarhub),然后对其调用一个方法。这是我的信号处理程序(NotifyClient):
public void NotifyClients(字符串消息)
{
Hub.GetClients().Log(消息);
}
现在,日志是我UI上的JavaScript方法。下面是我的JavaScript代码来处理这个问题:
mediator.Log = function (message) {
var msg = $.parseJSON(message);
$("#logContainer").append(msg.Data + "<br />");
mediator.Log=函数(消息){
var msg=$.parseJSON(消息);
$(“#logContainer”).append(msg.Data+”
);
这终于对我起作用了。方法的返回类型是Stream,下面是它的工作方式:
public Stream GetModules()
{
using (PMEntity ent = new PMEntity())
{
List<Module> ret = new List<Module>();
ret = ent.Modules.Include("Project").ToList();
return new MemoryStream(
Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(
ret.Select(e => new { Name = e.Name, Value = e.ID }))));
}
}
公共流GetModules()
{
使用(PMEntity ent=new PMEntity())
{
List ret=新列表();
ret=ent.Modules.Include(“项目”).ToList();
返回新内存流(
Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(
ret.Select(e=>new{Name=e.Name,Value=e.ID}));
}
}
您必须发送一个字符串,然后从JavaScript解析JSON。没有其他方法可以做到这一点。(我想您可以用不同的格式进行序列化,比如XML,但这基本上是相同的问题。)
public Stream GetModules()
{
using (PMEntity ent = new PMEntity())
{
List<Module> ret = new List<Module>();
ret = ent.Modules.Include("Project").ToList();
return new MemoryStream(
Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(
ret.Select(e => new { Name = e.Name, Value = e.ID }))));
}
}