【问题标题】:Wrong date being returned to controller from view从视图返回到控制器的日期错误
【发布时间】:2016-11-25 06:06:50
【问题描述】:

我有一个自定义日期选择器,它使用户能够从下拉菜单中选择日期并将其显示在视图的文本框中。这里使用的格式是'mm/dd/yy'。

当用户提交请求时,我通过 AJAX 帖子将其传递给控制器​​。这里的值是从文本框中获取的 txtStartTime 和 txtEndTime。 [例如:如果用户选择 2016 年 11 月 1 日,则显示为 11/01/16]

function SubmitData() { 
    var obj = { TaskId: ccount, TrajName: $('#drpTraj').find(":selected").text(), StartTime: $('#txtStartTime').val(), EndTime: $('#txtEndTime').val(), Aggr: $('#drpAggr').find(":selected").text() }

    var jobvm = {}
    jobvm["data"] = obj;
    $.ajax({
        type: "POST",
        url: "/Data/SubmitData",
        data: JSON.stringify({ dataObj: jobvm }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        success: function (msg) {
            ServiceSucceeded(msg);
        },
        error: function () {
            return "error";
        }
    });
}

数据类代码:

public int TaskId { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string Aggr { get; set; }
public string TrajName { get; set;}

我的问题是当我选择像November 1,2016 这样的日期时,它会显示在视图中并作为11/01/16 传递。但是一旦它到达控制器, 日期显示为11 Jan 2016,而不是01 Nov 2016。

我尝试了this post 中建议的解决方案,如下代码:

var dateString = dataObj.StartTime;
var format = "MM/dd/yyyy";
var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);

但它没有正确返回日期,因为控制器中收到的数据已经是 2016 年 1 月 11 日。 即使我尝试过dataObj.StartTime.ToString("MM-dd-yy")。但一切都只在 1 月 11 日回归。 请帮我找到解决方案。

【问题讨论】:

  • 这意味着您服务器上的文化是接受 dd/MM/yyyy 中的日期的文化 - 要么更改文化,要么使用自定义 ModelBinder
  • 我建议使用当前文化设置日期,或者通过在当前线程上设置所需的文化。通过这种方式,您不必转换日期格式。
  • @StephenMuecke:我已经收到11 January 2016。所以如果我改变文化,它会变成01 November 2016吗?请问什么是modelbinder?
  • @DirtyDeveloper :你的意思是在这一点上改变文化var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 吗?
  • 我认为这行不通。尝试设置日期时间文本框的页面加载。只是为了尝试!并在保存到数据库之前将其转换为您需要的任何格式

标签: c# asp.net asp.net-mvc datetime


【解决方案1】:

如何从客户端以 ISO 格式发送日期以避免服务器猜测日期格式?

var startTimeInClientCulture = '11/01/16'; //$('#txtStartTime').val();
var startTimeInIso = new Date(startTimeInClientCulture);
startTimeInIso.setTime( startTimeInIso.getTime() - startTimeInIso.getTimezoneOffset()*60*1000 );
//use startTimeInIso.toISOString() if you need a string instead of a Date type
//and send this in the ajax call

【讨论】:

  • 对不起。但我没有得到你。您的意思是从客户端以01/11/16 发送它以获取November 1st 2016?
  • 使用上面的 JavaScript 代码,值'11/01/16' 将被转换为格式2016-11-01T00:00:00.000Z。如果您在 ajax 请求中发送此值,服务器将能够创建 Nov 1, 2016 的 DateTime 实例而不是 11 Jan, 2016。
  • @ViVi,你试过这个吗?
猜你喜欢
  • 2021-03-02
  • 2012-12-12
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2017-02-13
相关资源
最近更新 更多