控制器代码:
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)\/"}];
*问题:
当模型数据被绑定时,它会向我显示人员ID为:324783035204000026但是当绑定过程完成时,它会更改为PersonId:324783035204000000和324126155204000001到324126155204000000
日期数据也没有正确绑定。
那背后的主要原因是什么?
如果您对此有任何疑问,请帮助我。答案 0 :(得分:1)
编号324783035204000026太大而无法用JavaScript准确表示,因此最后两位数字会被删除。您可以通过将PersonId
类中的PersonListModel
属性设置为字符串,而不是decmial或当前的任何内容来解决此问题。
如果由于某种原因无法修改PersonListModel
类,则应创建一个名为PersonListModelClient
的新类,其中包含JavaScript代码所需的属性子集,然后将每个PersonListModel
的数据复制到PersonListModelClient
的新实例中,然后将其编码为JSON。
这是因为日期在JSON中没有标准表示,因此Microsoft发明了一种类似于"\/Date(1347647400000)\/"
的格式,其中日期被编码为字符串。您有两个选择:如果您只想向用户显示日期,可以使用与以前相同的方法,并将BirthDate
属性更改为字符串,并使用{在服务器端执行格式化{1}}方法。或者,你可以use the answer to this question,它显示如何将特殊格式的字符串转换为常规的JavaScript Date对象。