2013-01-22 71 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);