如何构造返回JSON对象的服务器端数据源?

时间:2012-03-28 19:33:26

标签: c# asp.net json jquery

我目前刚接触客户端编程,特别是使用Jquery Ajax方法来调用服务器端方法。

到目前为止,我已经使用System.Web.Services.WebService来托管多个方法来返回String或bool。这种方法的优点是,我可以用类似的目的“分组”方法,例如“评论系统的方法”。正如我多次阅读的那样,缺点是* .asmx服务已经过时且Json支持不是很好。

我一直认为提供返回JSON对象的方法的好方法是使用泛型处理程序(* .ashx)。我过去编写的通用处理程序每​​个处理程序只提供一个“动作”。 是否使用通用处理程序来实现JSON数据源?我清楚地看到了无法“分组”方法的缺点,因为每个方法都在一个单独的.ashx.cs文件中。 (我知道我可以通过第二个参数来确定应该调用哪个“动作”,但不知何故感觉不对。)

目前使用WCF服务不是一个值得的选择,因为我使用的方法需要访问会话并调整服务以适应相同的目的,现在只是一种矫枉过正。

我想真正的问题是:在保持服务端方法的可读性/结构的同时返回JSON对象/ JSON对象列表的现代方法是什么?

修改:我正在使用Webforms 4.0

3 个答案:

答案 0 :(得分:1)

我坚持使用WebServices我从未遇到过从它们返回的JSON的问题。使用ajax和jQuery也很简单

    $.ajax({
        type: "POST",
        url: "/Methods/Zipcodes.asmx/GetPOIMarkersFrontendByTypeAndZip",
        data: "{latlng: '" + lat + "," + lng + "', type: '" + type + "', distance: '" + distance + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(html) {
        }
    }

是将数据传递到Web服务的简短示例

    [WebMethod]
    public object GetPOIMarkersFrontendByTypeAndZip(string latlng, string type, string distance)
    {
        var db = new SQLConnectionDataContext();

        string[] zip = latlng.Split(',');
        IQueryable<POI> points = db.POIs;
        int dist = string.IsNullOrEmpty(distance) ? 0 : Convert.ToInt32(distance);

        List<POI> poi = type == "0"
                            ? points.ToList()
                            : points.Where(p => p.poiTypeId == Convert.ToInt32(type)).ToList();

        return (from item in poi
                where !string.IsNullOrEmpty(item.Lat) && !string.IsNullOrEmpty(item.Lng)
                let dDist =
                    DoCalc(Convert.ToDouble(zip[0]), Convert.ToDouble(item.Lat.Trim()), Convert.ToDouble(zip[1]),
                           Convert.ToDouble(item.Lng.Trim()))
                where dDist <= dist
                select new GoogleMapMarker
                           {
                               lat = item.Lat,
                               lng = item.Lng,
                               data = FpsFunctions.IsLanguageFrench() ? item.fr : item.gb,
                               tag = item.poiTypeId.ToString()
                           }).ToList();
    }

这将返回一个包含4个变量的JSON数组供我使用。没有曾经有过问题,而且它允许你像ASP.NET允许的那样用动态填充html网站。只是让你了解jQuery:)

答案 1 :(得分:1)

我已经转移到MVC,这使得这类事情变得容易多了。但是当我在WebForms中执行此操作时,我将使用一个或多个处理器(ASHX)来接受一个action参数。然后将对action参数进行求值,以调用处理响应的适当目标方法。

如果你走这条路,那么你将为自己省去所有这些文件的头痛。而你必须在ajax调用上指定一个动作参数,你不必指定不同的文件名。

答案 2 :(得分:1)

我建议您查看 Web API

http://www.asp.net/web-api

  

ASP.NET Web API是一个可以轻松构建HTTP的框架   覆盖广泛客户的服务,包括浏览器和   移动设备。 ASP.NET Web API是一个理想的构建平台   .NET Framework上的RESTful应用程序。