Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何构造返回JSON对象的服务器端数据源?_C#_Asp.net_Json_Jquery - Fatal编程技术网

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

C# 如何构造返回JSON对象的服务器端数据源?,c#,asp.net,json,jquery,C#,Asp.net,Json,Jquery,我目前还不熟悉客户端编程,尤其是使用jqueryajax方法调用服务器端方法 到目前为止,我一直使用System.Web.Services.WebService托管多个方法来返回字符串或bool。这种方法的优点是,我可以“分组”具有类似目的的方法,比如“注释系统的方法”。正如我多次读到的,一个缺点是*.asmx服务已经过时,Json支持也不够好 我一直读到,提供返回JSON对象的方法的一个好方法是使用泛型处理程序(*.ashx)。我在过去编写的泛型处理程序只为每个处理程序提供一个“操作”。 对J

我目前还不熟悉客户端编程,尤其是使用jqueryajax方法调用服务器端方法

到目前为止,我一直使用System.Web.Services.WebService托管多个方法来返回字符串或bool。这种方法的优点是,我可以“分组”具有类似目的的方法,比如“注释系统的方法”。正如我多次读到的,一个缺点是*.asmx服务已经过时,Json支持也不够好

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

目前,使用WCF服务并不值得,因为我使用的方法需要访问会话,并且调整服务以满足相同的目的,这在目前来说是一种过分的选择

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


编辑:我正在使用Webforms 4.0

我会坚持使用Web服务,我从未遇到过从Web服务返回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();
    }
[WebMethod]
公共对象GetPOIMarkersFrontendByTypeAndZip(字符串latlng、字符串类型、字符串距离)
{
var db=new-SQLConnectionDataContext();
字符串[]zip=latlng.Split(',');
i可测量点=db.POIs;
int dist=string.IsNullOrEmpty(距离)?0:转换.ToInt32(距离);
列表poi=类型==“0”
?points.ToList()
:points.Where(p=>p.poiTypeId==Convert.ToInt32(type)).ToList();
返回(来自poi中的项目)
其中!string.IsNullOrEmpty(item.Lat)和&!string.IsNullOrEmpty(item.Lng)
让我们来谈谈=
DoCalc(Convert.ToDouble(zip[0])、Convert.ToDouble(item.Lat.Trim())、Convert.ToDouble(zip[1]),
Convert.ToDouble(item.Lng.Trim())

其中dDist我坚持使用WebServices,我从来没有遇到过从WebServices返回JSON的问题

    $.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();
    }
[WebMethod]
公共对象GetPOIMarkersFrontendByTypeAndZip(字符串latlng、字符串类型、字符串距离)
{
var db=new-SQLConnectionDataContext();
字符串[]zip=latlng.Split(',');
i可测量点=db.POIs;
int dist=string.IsNullOrEmpty(距离)?0:转换.ToInt32(距离);
列表poi=类型==“0”
?points.ToList()
:points.Where(p=>p.poiTypeId==Convert.ToInt32(type)).ToList();
返回(来自poi中的项目)
其中!string.IsNullOrEmpty(item.Lat)和&!string.IsNullOrEmpty(item.Lng)
让我们来谈谈=
DoCalc(Convert.ToDouble(zip[0])、Convert.ToDouble(item.Lat.Trim())、Convert.ToDouble(zip[1]),
Convert.ToDouble(item.Lng.Trim())

其中dDist我已经转到了MVC,这使这类事情变得容易多了。但当我在WebForms中这样做时,我会使用一个或多个处理程序(ASHX)来接收一个动作参数。然后,将对动作参数进行求值,以调用适当的目标方法来处理响应


如果你这样做,你就省去了所有这些文件的麻烦。在ajax调用中指定一个动作参数会带来什么损失,而不必指定不同的文件名会带来什么好处。

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


如果您这样做,您就省去了所有这些文件的麻烦。在ajax调用中指定操作参数会带来什么损失,而不必指定不同的文件名也会带来好处。

我建议您查看Web API

ASP.NET Web API是一个使构建HTTP变得容易的框架 服务覆盖范围广泛的客户端,包括浏览器和 ASP.NET Web API是构建移动设备的理想平台 NET框架上的RESTful应用程序


我建议查看Web API

ASP.NET Web API是一个使构建HTTP变得容易的框架 服务覆盖范围广泛的客户端,包括浏览器和 ASP.NET Web API是构建移动设备的理想平台 NET框架上的RESTful应用程序


你看过ASP.NET MVC吗?它提供了一些很好的内置支持,可以从你的控制器方法返回Json结果。@EricPetroleje:只是简单地说一下。我目前正在处理的项目将是一个Webforms项目。我知道我可以混合Webforms和MVC。但是听起来很有趣。你建议我使用一个类来“分组”吗还有几种返回ActionResult的方法?实际上,MVC内置了一个
JsonResult
类,专门用于从控制器操作返回JSON:您看过ASP.NET MVC吗?它为从控制器方法返回JSON结果提供了一些很好的内置支持。@EricPetro