在KnockoutJS中的MVC 4模型绑定

时间:2012-09-17 11:00:18

标签: knockout.js

控制器代码:

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/> 

调试时的结果:

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

*问题:

  1. 当模型数据被绑定时,它会向我显示人员ID为:324783035204000026但是当绑定过程完成时,它会更改为PersonId:324783035204000000和324126155204000001到324126155204000000

  2. 日期数据也没有正确绑定。

  3. 那背后的主要原因是什么?

    如果您对此有任何疑问,请帮助我。

1 个答案:

答案 0 :(得分:1)

  1. 编号324783035204000026太大而无法用JavaScript准确表示,因此最后两位数字会被删除。您可以通过将PersonId类中的PersonListModel属性设置为字符串,而不是decmial或当前的任何内容来解决此问题。

    如果由于某种原因无法修改PersonListModel类,则应创建一个名为PersonListModelClient的新类,其中包含JavaScript代码所需的属性子集,然后将每个PersonListModel的数据复制到PersonListModelClient的新实例中,然后将其编码为JSON。

  2. 这是因为日期在JSON中没有标准表示,因此Microsoft发明了一种类似于"\/Date(1347647400000)\/"的格式,其中日期被编码为字符串。您有两个选择:如果您只想向用户显示日期,可以使用与以前相同的方法,并将BirthDate属性更改为字符串,并使用{在服务器端执行格式化{1}}方法。或者,你可以use the answer to this question,它显示如何将特殊格式的字符串转换为常规的JavaScript Date对象。