Я использую утилиту ko.mapping, чтобы привязать мою модель mvc к knockoutjs. Моя модель MVC этоОтображение нокаута от MVC
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public Achievement[] achievements { get; set; }
}
public class Achievement
{
public string Title { get; set; }
public int Score { get; set; }
}
public ActionResult Index()
{
Person person = new Person
{
Name = "Name",
Surname = "Surname",
achievements = new Achievement[]
{
new Achievement { Title="Ach 1", Score=10 },
new Achievement { Title="Ach 2", Score=11 },
new Achievement { Title="Ach 3", Score=12 },
}
};
return View(person);
}
Я хочу, чтобы мой Javascript модель содержат некоторые дополнительные свойства, как лично, так и достижения объекты, поэтому я использую нокаут отображение плагин и писать только новые свойства в JavaScript (Person.fullName и достижение. Сообщение).
@{
string theData = new JavaScriptSerializer().Serialize(Model);
}
<div>
<div><label>Name </label> <span data-bind="text:Name"></span></div>
<div> <label>Surname </label> <span data-bind="text:Surname"></span> </div>
<div> <label>Full Name </label> <span data-bind="text:fullName"></span></div>
<ul data-bind="foreach:achievements">
<li>
<span data-bind="value:Title" />
<span data-bind="text:Score"></span>
<span data-bind="text:Message"></span>
</li>
</ul>
</div>
<script type="text/javascript">
personViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.fullName = ko.computed(function() {
return self.Name() + " " + self.Surname();
});
}
achievement = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.Message = ko.computed(function() {
return self.Title() + " " + self.Score();
});
}
ko.applyBindings(new personViewModel(@Html.Raw(theData)));
</script>
Проблема в том, что класс достижения не отображается вообще. Каков правильный способ загрузки данных с контроллера MVC без двойной записи модели в C# и в javascript.
Я попробовал ваш код, и я получаю эту ошибку. «Название не определено». – albert
@albert Попробуйте выполнить комментирование self.Message пока и посмотрите, работает ли он? Чтобы упростить работу, вы можете отлаживать код в консоли хром, перерыв точки –
Функция create не получает весь массив, а его отдельные элементы. Используйте 'create: function (options) {return new Achieve (options.data)}' (пример: https://jsfiddle.net/8ma2Lg12/) – user3297291