为啥数据在我的控制器中被截断为 0? [复制]

Posted

技术标签:

【中文标题】为啥数据在我的控制器中被截断为 0? [复制]【英文标题】: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 控制器 【参考方案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);

【讨论】:

但在我的区域设置中,. 是小数点分隔符。这不应该工作吗? 将参数设置为字符串似乎可行,但不是我正在寻找的解决方案。

以上是关于为啥数据在我的控制器中被截断为 0? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]

为啥我的 UIwebView 内容在 iOS 中被截断?

为啥控制器发送的 html 代码显示在我的页面中? [复制]

为啥 jquery 在 https 中被阻止? [复制]

Request.Result 中的字符串在 MVC 5 中被截断

为啥我的 UICollectionView 支持方法仅在我的 ViewController 设置为初始视图控制器时调用?