从ASP.NET页面返回JSON对象


70

在我的特定情况下,我有两种解决方案。我想找出哪一种更可行。在这种情况下,我还可以通过从服务器端代码返回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,并且@DavGarcia也建议从代码中输出一个新的JSON 。

Answers:


132

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

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

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

不过,可以考虑使用Web Service(asmx)或WCF,两者都可以输出JSON,而不是让.aspx页面输出JSON。


1
更新了答案,使其包含Response.End(),否则可能会呈现页面控件
Brian Webster

我们遇到的这种方法的问题之一是-如果您的页面很复杂并且具有多个用户控件,并且假设您的页面之一检查cookie,如果不存在,则尝试设置它。这总是会出错,抛出“发送HTTP标头后服务器无法修改Cookie”错误。
Ankur-m

当我使用Response.End(); 在我的代码中导致错误:{由于代码已优化或本机框架位于调用堆栈顶部,因此无法评估表达式。} ThreadAbortException错误
Rahul Jain

@davgarcia多数民众赞成在一个很好的答案,但是当我使用它时,我的上一页已从历史记录中删除(如果我使用后退按钮,我将无法返回)
SoliQuiD 2015年

@SoliQuid我有点困惑,您不想让浏览器导航到返回JSON的页面。对该页面的调用应该发生在客户端代码中的某个位置,例如jQuery .getJSON或.ajax调用。都不应该影响浏览器的历史记录。
DavGarcia

18

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

MVC框架具有用于JSON的各种帮助程序类,如果可以的话,我建议您使用一些MVC-love,否则,您可以轻松地获取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); });

2
感谢您的回答,我没有使用MVC,但将从您的回答开始进行研究。在这样做的同时,您能否提供一些您已经知道的资源(如果有)?
Subliminal Hash 2010年

1
凉!最简单的解决方案
Krismorte

12

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

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

4
我必须进行查找,以防万一其他人不知道Json对象是System.Web.Helpers.Json -如果您尚未或无法引用该DLL,则可以使用System.Web .Script.Serialization.JavaScriptSerializer,大致相同。
eselk

@Scott-如果要遍历单个ASP.net页上的记录集,应如何将它们分组(而不是像示例中那样是单个的)?
webdad3 2013年

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对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.