我使用的是WCF服务,我希望在其中使用对象列表进行响应。由于我的对象是由实体框架生成的,所以我不能真正返回List,因为它有一些循环引用,默认序列化失败。因此,我使用匿名类型来创建一个只包含我需要的属性的对象列表。这就是我正在做的,使用Json.NET:
[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;
}
如果我这样做,javascript得到的参数只是一个字符串,它无法将其视为我的对象列表。当然,它应该是一个Json字符串,我可以尝试解析它,使它从中提取对象。但我真的想像现在这样使用javascript并修改服务。例如,按照以下方式更改我的服务会很好:
public List<SimpleObject> DoWork()
{
return new List<SimpleObject>() { new SimpleObject("Florin", 1), new SimpleObject("Andrei", 2) };
}
SimpleObject不是EntityFramework对象,因此这没有问题。我想默认的序列化程序是Json,javascript应该得到基本相同的参数:Json字符串。
所以我的问题是,当通过Json.NET构建字符串不起作用时,如何让我的方法向JS发送匿名类型对象列表?提前谢谢。
查看SignalR。。。它将允许您从服务器端向JavaScript推送信息。我做了类似的事情,在我的ASP.NET MVC3页面上有一个WCF服务,然后每当我的服务接收到数据时,我就把它推送到我的JavaScript中。
我的服务发送信息到我的SignalR"调解员":
public void Message(string messagePacket)
{
new NotificationMediator().NotifyClients(messagePacket);
}
在我的情况下,我只是新建了一个新的中介(SignalR Hub),然后在它上调用一个方法。这是我的SignalR处理程序(NotifyClients):
public void NotifyClients(string message)
{
Hub.GetClients<NotificationMediator>().Log(message);
}
现在,Log是我UI上的一个JavaScript方法。以下是我处理此问题的JavaScript代码:
mediator.Log = function (message) {
var msg = $.parseJSON(message);
$("#logContainer").append(msg.Data + "<br />");
这对我来说终于奏效了。方法的返回类型是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 }))));
}
}