直接在客户端访问JSON对象的属性
问题描述:
由于与Sharepoint不兼容,我一直被委托将单页ASP.NET MVC 3 Web应用程序转换为ASP.NET 3.5 Web Forms应用程序。我无法访问Web窗体应用程序的json结果中的对象的属性。谁能告诉我我做错了什么?另外,当使用Web表单来返回JSON数据时,使用WCF服务还是常规Web服务更好?任何人都可以给我一些例子吗?使用内置的JavaScript序列化程序或JSON.net库会更好吗?这里是我的代码 -直接在客户端访问JSON对象的属性
MVC方法 -
public ActionResult LoadPerson()
{
var p = new Person;
p.Name = "Bob";
return Json(new { value = p}, JsonRequestBehavior.AllowGet); //what is the equivalent of this in webforms so I can access the properties directly?
}
MVC JavaScript文件 -
var person;
$.ajax({
url: 'Home/LoadPerson',
type: 'GET',
async: false,
contentType: 'application/json;',
dataType: 'json',
success: function (result) {
person = result.value;
}
});
alert(person.Name); //works fine.
Web窗体代码隐藏 -
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string LoadPerson()
{
var p = new Person();
p.Name = "Bob";
var serializer = new JavaScriptSerializer();
return serializer.Serialize(p);
}
Web窗体的JavaScript -
var person;
$.ajax({
url: 'Default.aspx/LoadPerson',
type: 'POST',
async: false,
contentType: 'application/json;',
dataType: 'json',
success: function (result) {
person = result.d;
}
});
alert(person.Name); //undefined. Why?
答
你的问题是由于手动JSON序列化你的页面方法的响应。在对服务的响应运行JSON.parse()
之后,jQuery留下了一个JSON字符串,而不是像.Name
这样的属性的对象。
ASP.NET automatically handles that step(使用JavaScriptSerializer内部本身,不会少于)。如果你只是返回对象,并让ASP.NET处理的翻译,它应该工作,你希望:
[WebMethod]
public static Person LoadPerson()
{
var p = new Person();
p.Name = "Bob";
return p;
}
看到这个职位的更详细的解释:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/
当你更改代码,我建议避免使用async: false
方法。由于JavaScript在单一共享线程中运行,并且在大多数浏览器中使用UI呈现来共享该线程,所以任何同步代码都会引入大量性能问题。这甚至可能导致脚本呈现无响应的脚本对话框,让用户可以选择取消其执行。
就是这样!非常感谢。如果我删除'asynx:false',那么Person对象可能就是null。顺便说一下,我是你网站的忠实粉丝:) – tempid 2012-02-04 03:52:31
我也在你的帖子的某个地方读过你的帖子,建议你去WCF路线而不是Web服务。我该如何解决这个问题?谢谢! – tempid 2012-02-04 03:53:32
@ user349308:如果您只需要一个用于AJAX调用的JSON端点,那么您现在正在做的是一个好方法。当您不需要任何高级功能或灵活性时,很难证明WCF的复杂性。 – 2012-02-04 05:29:19