我的任务是将一页的ASP.NET MVC 3 Web应用程序转换为ASP.NET 3.5 Web Forms应用程序,因为它与Sharepoint有些不兼容。我无法在Web窗体应用程序的json结果中访问对象的属性。谁能告诉我我做错了什么?此外,在使用Web表单返回json数据时,最好使用WCF服务还是常规Web服务?谁能给我一些例子?使用内置的Javascript序列化程序或JSON.net库是否更好?这是我的代码 -
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?
答案 0 :(得分:1)
您的问题是由于手动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呈现共享该线程,因此任何同步代码都会引入一系列性能问题。这甚至可能导致您的脚本呈现无响应的脚本对话框,让您的用户可以选择取消其执行。