C# 如何构造返回JSON对象的服务器端数据源?
我目前还不熟悉客户端编程,尤其是使用jqueryajax方法调用服务器端方法 到目前为止,我一直使用System.Web.Services.WebService托管多个方法来返回字符串或bool。这种方法的优点是,我可以“分组”具有类似目的的方法,比如“注释系统的方法”。正如我多次读到的,一个缺点是*.asmx服务已经过时,Json支持也不够好 我一直读到,提供返回JSON对象的方法的一个好方法是使用泛型处理程序(*.ashx)。我在过去编写的泛型处理程序只为每个处理程序提供一个“操作”。 对JSON数据源使用通用处理程序是正确的做法吗?我清楚地看到了无法“分组”方法的缺点,因为每个方法都位于单独的.ashx.cs文件中。(我知道我可以通过第二个参数来确定应该调用哪一个“操作”,但不知何故感觉不对) 目前,使用WCF服务并不值得,因为我使用的方法需要访问会话,并且调整服务以满足相同的目的,这在目前来说是一种过分的选择 我想真正的问题是:在保持服务端方法的可读性/结构的同时,返回JSON对象/JSON对象列表的现代方法是什么?C# 如何构造返回JSON对象的服务器端数据源?,c#,asp.net,json,jquery,C#,Asp.net,Json,Jquery,我目前还不熟悉客户端编程,尤其是使用jqueryajax方法调用服务器端方法 到目前为止,我一直使用System.Web.Services.WebService托管多个方法来返回字符串或bool。这种方法的优点是,我可以“分组”具有类似目的的方法,比如“注释系统的方法”。正如我多次读到的,一个缺点是*.asmx服务已经过时,Json支持也不够好 我一直读到,提供返回JSON对象的方法的一个好方法是使用泛型处理程序(*.ashx)。我在过去编写的泛型处理程序只为每个处理程序提供一个“操作”。 对J
编辑:我正在使用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