2012-09-17 145 views
0

控制器代碼:MVC 4模型KnockoutJS綁定

public ActionResult Index() 
{ 
PersonRepository repo = new PersonRepository(); 
PersonListModel lstPersons = new PersonListModel(); 
lstPersons.Persons = repo.GetAllPerson(); 
return View(lstPersons); 
} 

實際的JavaScript代碼:

<script type="text/javascript"> 

var personListData = @Html.Raw(Json.Encode(Model.Persons)); 

var viewModel = { 
personsModel : ko.observableArray(personListData) 

} 

ko.applyBindings(viewModel) 

<script/> 

結果,而Debugigng:

var personListData = [ 
    {"PersonId":324783035204000026,"FirstName":"Gibbbs","BirthDate":"\/Date(1347647400000)\/"},{"PersonId":324126155204000001,"FirstName":"Russel","BirthDate":"\/Date(1347561000000)\/"}]; 

*問題:

  1. 當模型數據得到bindinng它會告訴我的人ID爲:324783035204000026但是當綁定過程得到完成它做變動成PERSONID爲:324783035204000000及324126155204000001至324126155204000000

  2. 日期數據也無法正常結合。

那麼它背後的主要原因是什麼?

如果您對此有任何想法,請幫助我。

回答

1
  1. 324783035204000026這個數字太大,無法用JavaScript來準確表示,所以最後兩位數字被丟棄。你可以通過使你的PersonListModel類中的PersonId屬性成爲一個字符串,而不是一個十進制或當前的任何東西來解決這個問題。

    如果您不能修改PersonListModel類,不管什麼原因,你應該創建一個新的類,稱爲像PersonListModelClient,有你需要爲你的JavaScript代碼屬性的子集,然後從每個PersonListModel將數據複製到PersonListModelClient的新實例,然後將它們編碼爲JSON。

  2. 這是因爲日期在JSON中沒有標準表示法,所以微軟發明了一種格式,看起來像"\/Date(1347647400000)\/",其中日期被編碼爲一個字符串。您有兩種選擇:如果您只想向用戶顯示日期,則可以使用與以前相同的方法,並將BirthDate屬性更改爲字符串,然後使用DateTime.ToString方法在服務器端執行格式化。或者,您可以use the answer to this question,它顯示如何將特殊格式的字符串轉換爲常規的JavaScript Date對象。