Ответ 1
В коде есть много проблем. Начните с разметки. У вас есть таблица, и внутри каждой строки этой таблицы вы включаете скрытые поля. За исключением того, что вы жестко закодировали атрибут id
для этих скрытых элементов, что означает, что вы потенциально можете привести несколько элементов с одним и тем же идентификатором в вашей разметке, что приведет к недействительной разметке.
Итак, начнем с исправления вашей разметки в первую очередь:
@foreach (var t in Model.Types.ToList())
{
<tr>
<td>
<input type="hidden" value="@t.TransID" name="TransID" />
<input type="hidden" value="@t.ItemID" name="ItemID" />
<input type="hidden" value="@t.TypeID" name="TypeID" />
</td>
</tr>
}
Хорошо, теперь у вас есть действительная разметка. Теперь перейдите к событию javascript, который будет запущен при нажатии кнопки submitTest
. Если это кнопка отправки формы, я бы рекомендовал вам подписаться на событие .submit
формы вместо события .click
его кнопки отправки. Причина этого заключается в том, что форма может быть представлена, например, если пользователь нажимает клавишу Enter, когда фокус находится внутри некоторого поля ввода. В этом случае событие click не будет запущено.
Итак:
$(document).ready(function () {
$('form').submit(function () {
// code to follow
return false;
});
});
Хорошо, далее идет часть, где вам нужно собрать значения скрытых элементов, которые находятся внутри таблицы, и поместить их в объект javascript, который мы впоследствии будем сериализовать JSON и отправить как часть запроса AJAX на сервер.
Отпустите:
var parameters = [];
// TODO: maybe you want to assign an unique id to your table element
$('table tr').each(function() {
var td = $('td', this);
parameters.push({
transId: $('input[name="TransID"]', td).val(),
itemId: $('input[name="ItemID"]', td).val(),
typeId: $('input[name="TypeID"]', td).val()
});
});
До сих пор мы заполнили наши параметры, теперь отправьте их на сервер:
$.ajax({
url: this.action,
type: this.method,
data: JSON.stringify(parameters),
contentType: 'application/json; charset=utf-8',
success: function (result) {
// ...
},
error: function (request) {
// ...
}
});
Теперь перейдите на сервер. Как всегда, мы начинаем с определения модели представления:
public class MyViewModel
{
public string TransID { get; set; }
public string ItemID { get; set; }
public string TypeID { get; set; }
}
и действия контроллера, которые возьмут коллекцию этой модели:
[HttpPost]
public ActionResult Update(IList<MyViewModel> model)
{
...
}
И вот окончательный код на стороне клиента:
$(function() {
$('form').submit(function () {
if ($(this).valid()) {
var parameters = [];
// TODO: maybe you want to assign an unique id to your table element
$('table tr').each(function() {
var td = $('td', this);
parameters.push({
transId: $('input[name="TransID"]', td).val(),
itemId: $('input[name="ItemID"]', td).val(),
typeId: $('input[name="TypeID"]', td).val()
});
});
$.ajax({
url: this.action,
type: this.method,
data: JSON.stringify(parameters),
contentType: 'application/json; charset=utf-8',
success: function (result) {
// ...
},
error: function (request) {
// ...
}
});
}
return false;
});
});
Очевидно, что если ваша модель просмотра отличается (вы не указали ее в своем вопросе), вам может потребоваться адаптировать код так, чтобы он соответствовал вашей структуре, в противном случае связующее устройство по умолчанию не сможет десериализовать JSON.