Я пытаюсь создать Grid, используя knockout.js, следуя http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/
когда я пытаюсь опубликовать значения из viwe в контроллер, всегда получаю значение count = 0. Но я пытаюсь проверить, имеет ли данные модель представления с использованием alert.it, как ожидается. Там кто-нибудь сталкивался/исправлял это issue.kindly выделите меня, где ошибка.
она моя модель.
public class GiftModel
{
public string Title { get; set; }
public string Price { get; set; }
}
Код в COntroller:
public ActionResult Index()
{
var initialState = new[] {
new GiftModel { Title = "Head First C#", Price = "49.95" },
new GiftModel { Title = "Head First Js", Price = "78.25" }
};
return View(initialState);
}
[HttpPost]
public ActionResult Index(IEnumerable<GiftModel> gifts)
{
return View();
}
Вот что делает ia ma.
var initialData = @Html.Raw (новый System.Web.Script.Serialization.JavaScriptSerializer(). Сериализация (модель));
var viewModel = {
gifts : ko.observableArray(initialData),
addGift: function () {
this.gifts.push({ Title: "", Price: "" });
},
removeGift: function (gift) {
this.gifts.remove(gift);
},
save: function() {
var data = ko.toJSON(this.gifts);
alert(data);
ko.utils.postJson(location.href, { gifts: data });
}
};
ko.applyBindings(viewModel,document.body);
Я тоже пробовал с обычной Ajax-страницей. Но все равно я получаю то же самое.
Редактировать: вот что я получаю в оповещении
[{"Название": "Голова первая С#", "Цена": "49,95"}, {"Название": "Голова первый Js", "Цена": "78.25"}]
Обновление: если я передаю всплывающее содержимое, контроллер напрямую сможет идентифицировать данные.
var model = [{"Title":"Head First C#","Price":"49.95"},{"Title":"Head First Js","Price":"78.25"}];"Status": "Reserved" }];
$.ajax({
url: '/Grid/Index',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(model),
success: function (result) {
}
});
Наконец, я достиг этого.
Нам нужно вызвать ko.toJS(this.gifts)
перед отправкой данных в запрос.
Вот рабочий код.
var initialData = @Html.Raw(Json.Encode (модель));
var viewModel = {
gifts : ko.observableArray(initialData),
addGift: function () {
this.gifts.push({ Title: "", Price: "" });
},
removeGift: function (gift) {
this.gifts.remove(gift);
},
Save : function () {
var ViewModel = ko.toJS(this.gifts);
$.ajax({
type: "POST",
url: "/Grid/Index",
data: ko.toJSON(ViewModel),
contentType: 'application/json',
async: true,
complete: function () {
alert('success');
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Error');
}
});
}
};
Спасибо Ivan.Srb, szpic.
Я просто хочу спросить: у вас есть модель:
public class GiftModel
{
public string Title { get; set; }
public double Price { get; set; }
}
почему вы вдавливаете в ценовые строки, в то время как они удваиваются?
new GiftModel {/**/, Price = "78.25" }
в ссылке, которую вы указали в этой строке, выглядит следующим образом:
new GiftModel { /**/, Price = 78.25 }
Я не говорю, что это поможет решить вашу проблему. Мне просто интересно.
@Обновить
На этой веб-странице: KnockOutJS Homepage Вы можете найти эту строку:
// To actually transmit to server as a regular form post, write this:
ko.utils.postJson($("form")[0], self.gifts);
Без использования ko.toJSON (данные); Поэтому в вашем случае это будет:
ko.utils.postJson(youradress,this.gifts)
Проверь это :)
Попробуйте использовать ko.toJS
вместо ko.toJSON
.
Обновление:
Попробуйте это (вместо ko.utils.postJson
):
$.ajax({
url: <your_url>,
type: 'POST',
contentType: "application/json",
data: JSON.stringify(data)
});
ko.toJSON()
. внутреннеko.utils.postJson()
сделает это за вас.