是否有ASP.NET Boilerplate获取JSON数据的方法?

时间:2018-03-22 08:26:17

标签: javascript jquery json ajax aspnetboilerplate

我目前正在尝试这个,但我一直看到可怕的错误:

  

位置1的JSON中出现意外的令牌o

enter image description here

我正在努力寻找解决方案,并想知道是否有人有任何关于如何解决这个问题的提示?

被序列化为JSON的类:

[Serializable]
public class GeoCoordinate
{
    public GeoCoordinate()
    {
    }

    [JsonProperty(PropertyName = "lat")]
    public double Latitude { get; }

    [JsonProperty(PropertyName = "long")]
    public double Longitude { get; }

    public GeoCoordinate(double latitude, double longitude)
    {
        Latitude = latitude;
        Longitude = longitude;
    }

    public override string ToString()
    {
        return string.Format("{0},{1}", Latitude, Longitude);
    }
}

Ajax电话:

function getLocationData() {
    jQuery.ajax({
        url: abp.appPath + "Home/GetLocationsAsync",
        type: "GET",
        dataType: "json",
        async: true,
        success: function (data) {
            var myArray = jQuery.parseJSON(data);
            locations = [];
            $.each(myArray, function (index, element) {
                locations.push([element.lat, element.long]);
            });
        }
    });
}

控制器:

[HttpGet]
public async Task<JsonResult> GetLocationsAsync()
{
    var cords = await _practiceAppService.GetAllGeoCoordinates();
    return Json(cords);
}

AppService服务:

public async Task<IList<GeoCoordinate>> GetAllGeoCoordinates()
{
    var geoCoordinates = await Repository.GetAll()
        .Where(x => !x.Disabled && !x.Latitude.Equals(0) && !x.Longitude.Equals(0))
        .Select(x => new GeoCoordinate(x.Latitude, x.Longitude))
        .ToListAsync();

    return geoCoordinates;
}
尝试呼叫parseJSON之前

Console.log 数据:

console.log(data);
var myArray = jQuery.parseJSON(data);

enter image description here

2 个答案:

答案 0 :(得分:3)

巧合的是,有一个名为The ASP.NET Boilerplate Way的部分可以解决这个问题。

请注意,只有第2点特定于ABP:

  1. GetLocationsAsync返回一个JSON对象而不是字符串,因此您不应该调用parseJSON

    您可以使用以下内容重现错误消息:jQuery.parseJSON({});

  2. ABP包裹JsonResult。来自AJAX Return Messages的文档:

      

    此返回格式由 abp.ajax 函数识别和处理。

    您可以使用[DontWrapResult]属性,但您也可以在此处利用ABP。 abp.ajax handles the display of error messages如果您抛出UserFriendlyException

  3. 由于ajax是异步的,getLocationData无法直接返回locations

    您可以返回链式Promise。如果您是Promises的新用户,请先阅读Using Promises

  4. $.eachpush更简洁。

    您可以使用map

  5. 最后:

    function getLocationData() {
        return abp.ajax({
            url: abp.appPath + "Home/GetLocationsAsync",
            type: 'GET'
        }).then(function (result) {
            return result.map(function (element) {
                return [element.lat, element.long];
            });
        });
    }
    

    用法:

    getLocationData().then(function (locations) {
        console.log(locations);
    });
    

答案 1 :(得分:2)

如果返回类型是JsonResult,则ASP.NET Boilerplate默认包装ASP.NET MVC操作结果。因此,如果您想获得结果,可以禁用包装。尝试将 [DontWrapResult] 属性添加到 GetLocationsAsync 方法。

[DontWrapResult]
[HttpGet]
public async Task<JsonResult> GetLocationsAsync()
{
    var cords = await _practiceAppService.GetAllGeoCoordinates();
    return Json(cords);
}

PS:您不需要添加此属性。您可以从结果字段中获取它。通过浏览器的开发控制台检查响应,看看它是如何包装的。