【问题标题】:Access properties of JSON object directly in client-side直接在客户端访问 JSON 对象的属性
【发布时间】:2012-02-04 02:28:10
【问题描述】:

由于与 Sharepoint 不兼容,我的任务是将单页 ASP.NET MVC 3 Web 应用程序转换为 ASP.NET 3.5 Web 窗体应用程序。我无法访问 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?

【问题讨论】:

    标签: jquery asp.net-mvc webforms


    【解决方案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 渲染共享该线程,因此任何同步代码都会引入大量性能问题。这甚至可能导致您的脚本显示一个无响应的脚本对话框,让您的用户可以选择取消其执行。

    【讨论】:

    • 就是这样!!非常感谢。如果我删除asynx:false,Person 对象是否有可能为空。顺便说一句,我是你网站的忠实粉丝 :)
    • 我还在某处读过您的帖子,您建议使用 WCF 路由而不是 Web 服务。我该怎么做?谢谢!
    • @user349308:如果您只需要一个用于 AJAX 调用的 JSON 端点,那么您现在正在做的是一个好方法。当您不需要 WCF 的任何高级功能或灵活性时,很难证明其复杂性是合理的。
    • 在上面的链接中,文章有代码sn-p从服务器端获取一些数据到客户端(GetDave方法)。如何将 Person 对象从客户端发送到服务器端?我可以用var p = new Person; 填写属性并将其发送过来吗?它会自动将客户端 Person 与服务器端 Person 匹配吗?你有一个例子吗?非常感谢!
    • 我刚刚尝试了上述方法,但萤火虫说“人员未定义”。参数名称与我的服务器端代码匹配。这是我的代码 - var p= new Person(); p.Name= "test"; $.ajax({ url: 'Default.aspx/SavePerson', data: { person: p }, type: 'POST', contentType: 'application/json;', dataType: 'json' });
    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2021-12-05
    相关资源
    最近更新 更多