【问题标题】:Returning JSON object from an ASP.NET page从 ASP.NET 页面返回 JSON 对象
【发布时间】:2011-01-26 06:00:21
【问题描述】:

在我的特殊情况下,我有几个解决问题的方法。我想找出哪个更可行。在这种情况下,我也可以通过从我的服务器端代码返回一个 JSON 对象来实现我的目标;但是,我不知道它是如何完成的,以及最好的方法是什么。

首先,我不需要完整的 aspx 页面,因为我只需要从代码返回的响应。那么,我是使用 Web 服务、处理程序还是有任何其他特定的方法来做到这一点?

这个解决方案可行吗?我是否使用 StringBuilder 类构建 JSON 字符串并将该字符串注入目标 aspx 页面?有什么注意事项或需要注意的事项吗?

我很欣赏你的想法。

问候,

凯末尔

------------更新!------------

假设我的 userlist.aspx 页面中有一个 JSON 对象,然后我将其与 jQuery 一起使用...

{"menu": {
  "id": "color1",
  "value": "color",
  "popup": {
    "menuitem": [
      {"value": "Red"},
      {"value": "Green"},
      {"value": "Yellow"}
    ]
  }
}} // example taken from the json.org/example page

现在,当我想从我的 aspx 页面添加新菜单项时,我该怎么办...我认为这样我的问题更具体...

假设我在我的 aspx 代码中创建了一个新字符串,例如 "{"value": "Blue"}。如何将其注入目标页面中已经存在的项目列表中?或者这不是处理这种情况的正确方法吗?如果没有,还有什么方法可以实现?

另外,如果我想在将新项目添加到此列表时触发 jQuery 事件,这是如何实现的?

------------2015 年 8 月 26 日更新 2 ------------

当我问这个问题时,我处理问题的方式是另一方面。我现在对该主题更加精通,并且可以很高兴地接受投票最多的答案,因为解决这个问题的方法显然不应该包括已经存在的 JSON,并从代码中输出一个新的 JSON,正如 @DavGarcia 所建议的那样。

【问题讨论】:

    标签: asp.net json


    【解决方案1】:

    使用 asp 没问题....使用 MVC 这样做是最自然的,但也可以使用标准 asp 来完成。

    MVC 框架有各种各样的 JSON 辅助类,如果可以的话,我建议你加入一些 MVC 爱好者,如果没有,你可能很容易获得 MVC 使用的 JSON 辅助类并使用它们在 asp.net 的上下文中。

    编辑:

    这是一个如何使用 MVC 返回 JSON 数据的示例。这将在您的控制器类中。这是 MVC 开箱即用的功能——当你创建一个新的 MVC 项目时,这些东西会自动创建,所以没什么特别的。我唯一要做的就是返回一个 JSON 的 actionResult。我调用的 JSON 方法是 Controller 类上的一个方法。这都是非常基本的默认 MVC 内容:

    public ActionResult GetData()
    {
        var data = new { Name="kevin", Age=40 };
        return Json(data, JsonRequestBehavior.AllowGet);
    }
    

    因此可以通过 JQuery 作为 ajax 调用来调用此返回数据:

    $.get("/Reader/GetData/", function(data) { someJavacriptMethodOnData(data); });
    

    【讨论】:

    • 感谢您的回答,我没有使用 MVC,但将从您的回答开始进行研究。在我这样做的同时,您能否提供一些您已经知道的资源(如果有的话)?
    • 酷!最简单的解决方案
    【解决方案2】:

    如果你得到代码,使用类似这样的代码

            MyCustomObject myObject = new MyCustomObject();
            myObject.name='try';
            //OBJECT -> JSON
            var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            string myObjectJson = javaScriptSerializer.Serialize(myObject);
            //return JSON   
            Response.Clear();     
            Response.ContentType = "application/json; charset=utf-8";
            Response.Write(myObjectJson );
            Response.End();
    

    因此,您返回一个使用 MyCustomObject 的所有属性序列化的 json 对象。

    【讨论】:

      【解决方案3】:

      使用 ASP.NET 网页,您可以在单个页面上执行此操作,作为一个基本的 GET 示例(可以工作的最简单的方法。

      var json = Json.Encode(new {
          orientation = Cache["orientation"],
          alerted = Cache["alerted"] as bool?,
          since = Cache["since"] as DateTime?
      });
      Response.Write(json);
      

      【讨论】:

      • 我必须查一下,以防其他人不知道,那个 Json 对象是 System.Web.Helpers.Json -- 如果你还没有引用那个 DLL,或者不能t,您可以使用 System.Web.Script.Serialization.JavaScriptSerializer,其工作原理大致相同。
      • @Scott - 如果您在单个 ASP.net 页面上循环浏览记录集,您将如何对它们进行分组(而不是像您的示例中那样单独)?
      【解决方案4】:

      在您的 Page_Load 中,您需要清除正常输出并编写自己的输出,例如:

      string json = "{\"name\":\"Joe\"}";
      Response.Clear();
      Response.ContentType = "application/json; charset=utf-8";
      Response.Write(json);
      Response.End();
      

      要将 C# 对象转换为 JSON,您可以使用 Json.NET 等库。

      但不要让您的 .aspx 页面输出 JSON,而是考虑使用 Web 服务 (asmx) 或 WCF,两者都可以输出 JSON。

      【讨论】:

      • 更新了答案以包含 Response.End(),否则可能会呈现页面控件
      • 我们在使用这种方法时遇到的一个问题是 - 如果您的页面很复杂并且有多个用户控件,并且假设您的某个页面会检查 cookie,如果它不存在,则尝试设置它。这将始终抛出“发送 HTTP 标头后服务器无法修改 cookie”错误。
      • 当我使用 Response.End();在我的代码中,它导致错误:{无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。} ThreadAbortException 错误
      • @davgarcia 这是一个很好的答案,但是当我使用它时,我的上一页会从历史记录中删除(如果我使用后退按钮我无法返回)
      • @SoliQuid 我有点困惑,您不想让浏览器导航到返回 JSON 的页面。对该页面的调用应该发生在客户端代码中的某处,例如在 jQuery .getJSON 或 .ajax 调用中。两者都不应该影响浏览器历史记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多