【问题标题】:Why the data get truncate to 0 in my controller? [duplicate]为什么数据在我的控制器中被截断为 0? [复制]
【发布时间】:2018-10-01 10:16:48
【问题描述】:

我正在迁移一个应用程序,所以这段代码已经可以工作了。

我有一个角度函数来创建随机 avl 输入来测试我的 api。

$scope.createAvl = function () {
    console.log($scope.avl); // for debug
    $scope.avl.push({
        'tracker_avl_id': getRandomArbitrary(0, 1000000, 1),
        'car_id': getRandomArbitrary(0, 10000, 1),
        'x_lat': getRandomArbitrary(-69, -66, 0),
        'y_long': getRandomArbitrary(8, 10, 0),
        'azimuth': getRandomArbitrary(0, 359, 1),
        'event_time': getRandomDate()
    });
};

如您所见,数据已创建并正确显示在页面上

然后Save Avl函数发送数据

$scope.saveAvl = function () {
    var data = $.param({
        avl_list: $scope.avl
    });

    var config = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
        }
    };        

    $http.post('/Avl_Api/traffic_tracker_avl/putTrafficAvl', data, config)
    .success(function (data, status, headers, config) {            
        console.log('Sucess.....');           
    })
    .error(function (data, status, header, config) {
        $scope.ResponseDetails = "Data: " + data +
            "<hr />status: " + status +
            "<hr />headers: " + header +
            "<hr />config: " + config;
    });
};

问题出在我的控制器上,avl_list 上的所有元素的坐标 x 和 y 都为 0,所有其他字段都可以。

public partial class traffic_tracker_avl
{
    public int avl_id { get; set; }
    public long tracker_avl_id { get; set; }
    public long car_id { get; set; }
    public decimal x_lat { get; set; }
    public decimal y_long { get; set; }
    public int azimuth { get; set; }
    public System.DateTime event_time { get; set; }
    public Nullable<System.DateTime> created_at { get; set; }
}

[HttpPost]
public JsonResult putTrafficAvl(List<traffic_tracker_avl> avl_list)
{
    avl_list.ForEach(n => db.traffic_tracker_avl.Add(n));
    db.SaveChanges();
}

我猜与十进制字段有关?但是奇怪的是得到 0 而不是截断为整数。我仔细检查了一下,数据和模型字段名称是一样的。

【问题讨论】:

  • 使用$.param() 加载后data 的外观如何?
  • @lex 不知道你能不能在这里理解。但看起来还可以avl_list%5B0%5D%5Btracker_avl_id%5D=2126&amp;avl_list%5B0%5D%5Bcar_id%5D=712&amp;avl_list%5B0%5D%5Bx_lat%5D=-66.616149&amp;avl_list%5B0%5D%5By_long%5D=9.25226&amp;avl_list%5B0%5D%5Bazimuth%5D=173&amp;avl_list%5B0%5D%5Bevent_time%5D=2016-09-28+06%3A02&amp;avl_list%5B1%5D%5Btracker_avl_id%5D=739125&amp;avl_list%5B1%5D%5Bcar_id%5D=7203&amp;avl_list%5B1%5D%5Bx_lat%5D=-68.003599&amp;avl_list%5B1%5D%5By_long%5D=9.043924&amp;avl_list%5B1%5D%5Bazimuth%5D=1&amp;avl_list%5B1%5D%5Bevent_time%5D=2016-09-28+05%3A03
  • 是的,很糟糕。我想我希望它已经调整了纬度/经度参数。我难住了。这是 Web API 2 后端吗?只是把它扔在那里,但我们从来不需要序列化或添加任何配置内容(并且我们返回一个 IHttpActionResult)。
  • @lex as OJ 建议我尝试从十进制更改为字符串并获取数据。但这感觉不对。它是一个带有附加操作的 MVC 5 控制器

标签: c# jquery angularjs asp.net-mvc type-conversion


【解决方案1】:

如果您使用的计算机的文化不是英语,而是类似于西班牙语,那么 -68.504806 的值不是有效数字。

对此有几种解决方案:一种更简单的解决方案是先将其绑定到模型中的string 属性,然后使用代码将其映射到正确的数字:

string x_lat_input = String.Empty; // use this in your model property

var x_lat = Convert.ToDecimal(x_lat_input, CultureInfo.CurrentCulture);

【讨论】:

  • 但在我的区域设置中,. 是小数点分隔符。这不应该工作吗?
  • 将参数设置为字符串似乎可行,但不是我正在寻找的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多