3

使用 Angular JS 将日期时间和日期时间的复杂对象回传到服务器时?值没有正确绑定。我试过 JSON.stringify 无济于事。我已经发布了一个相关的问题,尽管它可能太笼统了。我真正需要知道的是如何正确传递这些日期。我目前正在做的是在 js 中使用解决方法来转换日期,但我宁愿不这样做,而只是在 Angular 中以我需要的形式获取日期然后传回正确的值。

你如何绑定到那些日期时间/日期时间?值正确吗?请参阅以下代码示例和 Fiddler 发布结果。

C#类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public DateTime? ApprovedForSomething { get; set; }
}

Angular JS 控制器:

function PersonController($scope, $http) {
    $scope.getPerson = function () {
        $http.get('../../Home/GetPerson/1').success(function (data) {
            $scope.Person = data;
        });
    }
    $scope.updateApprovedForSomething = function () {
        $http.post('../../Home/UpdatePerson', { person: $scope.Person }).success(function (data) {
            console.log(data);
        });
    }
}

提琴手帖子:

HTTP/1.1 200 OK 缓存控制:私有内容类型:应用程序/json;charset=utf-8 Server: Microsoft-IIS/8.0 X-AspNetMvc-Version: 4.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcbmlja1xkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXFZhbGlkYXRpb25UZXN0XEhvbWVcR2V0UGVyc29uXDE=?= X-Powered-By: ASP.NET 日期:2013 年 1 月 16 日,星期三 14:48:34 GMT 内容长度:124

{"FirstName":"Bob","LastName":"Smith","BirthDate":"/Date(695573315098)/","ApprovedForSomething":"/Date(1358261315098)/"}

这是服务器端的结果。日期时间绑定到不正确的新日期时间值和日期时间?一片空白。

在此处输入图像描述

4

2 回答 2

3

如果有人有更好的解决方案,请随时更新答案。

那里可能有更好的解决方案,但我所做的是非常简单的解决方法。只需为 DateTime 对象创建一个封装属性以将其用于字符串并将其用于绑定目的。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public DateTime? ApprovedForSomething { get; set; }
    public DateTime BirthDateAsString 
    {
        get { return BirthDate.ToShortDateString();}
        set { DateTime.Parse(value, BirthDate);}
   }
}

通过 http,所有对象都被视为字符串,但 ASP.NET 足够智能,可以提供模型绑定功能。但是,它无法将 JavaScript Date 对象绑定到 .NETDateTime对象。

于 2013-01-24T20:31:24.097 回答
2

更强大的方法是使用模型绑定器来处理所有传入的日期。

public class DateTimeBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var name = bindingContext.ModelName;
        var value = bindingContext.ValueProvider.GetValue(name);
        if (value == null) 
            return null;

        DateTime date;
        if (DateTime.TryParse(value.AttemptedValue, null, DateTimeStyles.RoundtripKind, out date))
            return date;
        else
            return base.BindModel(controllerContext, bindingContext);
    }
}

添加全局 ASAX。

var dateTimeBinder = new DateTimeBinder();

ModelBinders.Binders.Add(typeof(DateTime), dateTimeBinder);
ModelBinders.Binders.Add(typeof(DateTime?), dateTimeBinder);
于 2016-01-12T10:56:21.060 回答