2013-01-22 73 views
3

当使用Angular JS将日期时间和日期时间回传到具有复杂对象的服务器时?值不能正确绑定。我已经试过JSON.stringify无济于事。我已经发布了一个相关的问题,尽管可能它太笼统了。我真正需要知道的是如何正确地传递这些日期英寸我目前正在做的是在js中使用变通方法来转换日期,但我宁愿不这样做,只是在我需要他们在Angular然后传回正确的值。与MVC4模型绑定与日期/日期时间失败的角JS?

你如何绑定到那些日期时间/日期时间?值正确?请参阅下面的代码示例和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; } 
} 

角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); 
     }); 
    } 
} 

的Fiddler发表:

HTTP/1.1 200 OK缓存控制:私人内容类型:应用/ JSON; 的charset = UTF-8服务器:Microsoft-IIS/8.0 X-AspNetMvc-版本:4.0 X-ASPNET-版本:4.0.30319 X-SourceFiles:???? = UTF-的8B YzpcdXNlcnNcbmlja1xkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXFZhbGlkYXRpb25UZXN0XEhvbWVcR2V0UGVyc29uXDE = = X- Powered by By:ASP.NET Date:Wed,16 Jan 2013 14:48:34 GMT Content-Length:124

{“FirstName”:“Bob”,“LastName”:“Smith”,“BirthDate” : “/日期(695573315098)/”, “ApprovedForSomething”: “/日期(1358261315098)/”}

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

enter image description here

回答

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对象绑定到.NET DateTime对象。

+1

嗨@Jigar,感谢您的留言。我不得不承认,我希望有一个答案可以帮助“设定并忘记它”的方法,换句话说,不是那么手动的东西,但是因为你是唯一回答并且我已经使用这种方法并知道它的工作我把你的标记为答案。感谢您的输入。 – likestoski

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);