为什么这个日期时间空了?

时间:2014-12-11 20:58:17

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

我将模型传递给包含异步加载的表单的视图partial。似乎所有事情都会如预期的那样出现,除了日期时间,这会导致这种情况发生吗?

Javascript功能

function loadUpdateEventForm(eventID) {
        getEventDetails(eventID, function(dnnEvent) {
            if(dnnEvent != null) {
                $("#updateEventForm").load(urlEditEventForm, dnnEvent, function () {
                    $("form#updateEventForm").submit(function (event) { submitNewEvent(event); });
                });
                dialog = $("#updateEventForm").dialog({ modal: true, width: '80%', position: { my: 'top', at: 'top+150' } });
                console.log(dnnEvent);
                return;
            }
        });
}

来自console.log(dnnEvent)的输出

Object {EventID: 2524, EventName: "sample", EventDescription: "sample", EventTimeBegin: "/Date(1418709600000)/", UserID: 1}

提供部分视图的C#操作方法

public ActionResult _EditForm(DNNEventUpdateModel dnnEvent)
{
    return View(dnnEvent);
}

DNNEventUpdateModel

public class DNNEventUpdateModel
{
    [Required]
    public int EventID { get; set; }
    [Required]
    public string EventName { get; set; }
    [Required]
    [DataType(DataType.MultilineText)]
    public string EventDescription { get; set; }
    [Required]
    public DateTime EventTimeBegin { get; set; }
    public int UserID { get; set; }

    public string EventTimeBeginForDisplay
    {
        get
        {
            return this.EventTimeBegin.ToShortDateString();
        }

        set
        {
            this.EventTimeBegin = Convert.ToDateTime(value);
        }
    }
}

更新

刚刚意识到我忘了在控制器中发布这是怎么回事。这就是我对日期的意思:

screenshot

3 个答案:

答案 0 :(得分:1)

也许有更好的解决方案,但我将javascript日期作为字符串发送到服务器,试试。

var date = new Date();
var day = date.getDay();        
var month = date.getMonth();    
var year = date.getFullYear();  
var hour = date.getHours();     
var minute = date.getMinutes(); 
var second = date.getSeconds();

var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second;

然后,在服务器端解析字符串。

DateTime.ParseExact(dateFromClient, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

修改

我在发送日期前曾使用过一次该功能。

function EditDate(oldDate) {
    var date = oldDate.split(".");
    return date[2] + "." + date[1] + "." + date[0];
}

答案 1 :(得分:1)

日期格式EventTimeBegin: "/Date(1418709600000)/"是默认JsonScriptSerializer的函数,将在this question的答案中详细讨论。

您可以使用

将值解析为字符串
new Date(parseInt(response.TimeBegin.replace("/Date(", "").replace(")/",""), 10))

其他选项包括在控制器方法中格式化日期,例如

var data = new
{
  ....
  TimeBegin = YourDate.ToString("o"),
  ....
};
return Json(data, JsonRequestBehavior.AllowGet);

并在脚本中

new Date(response.TimeBegin);

或使用另一个json序列化程序,例如Json.NET,它以ISO格式序列化日期。

This blog还讨论了一些客户端和服务器端解决方案。

答案 2 :(得分:0)

看起来你正在做一个表格帖子。

$("form#updateEventForm").submit(function (event) { submitNewEvent(event); });

因此MVC端的模型绑定器不使用JSON解析器。我猜是submitNewEvent将事件中的值填充到表单字段中。由于不涉及JSON模型绑定器,因此无法正确处理JSON格式化日期的表单字段。

如果您使用类似$.post的内容并且逐字发布JSON字符串而不是填充表单,MVC将处理JSON帖子。这样,在模型绑定期间使用JSON解析器,并且将正确处理JSON格式化日期。

否则,如果您承诺使用表单帖子,则需要在发布之前使用格式正确的日期填充表单。这将是&#39; YYYY-MM-DD&#39;或换句话说<input value='2014-01-30'>。您不能盲目地使用JSON格式的日期字符串并将其插入表单字段。

当然,我根据您使用的javascript函数调用做出假设,但我们没有代码。