#asp.net-mvc-3 #jquery #asp.net-ajax
#asp.net-mvc-3 #jquery #asp.net-ajax
Вопрос:
У меня есть простой проект mvc, состоящий из одной таблицы с именем Persons, и эта таблица имеет некоторые атрибуты, такие как имя, возраст, фамилия и так далее.
Недавно я добавил атрибут к таблице, который имеет тип bit
в SQL и bool
в C #, и для меня он представляет некоторый статус. Если все в порядке, я присваиваю этому статусу значение true или false.
На одном контроллере я создаю индексное представление моих пользователей в базе данных и отображаю статус в виде флажка. Все работает нормально. Что я хочу сделать, так это изменить статус, если я нажму на этот флажок вместо использования режима редактирования для всех атрибутов. Я просто хочу сохранить значение флажка из моего индексного представления в базу данных.
Некоторые люди посоветовали мне создать действие в моем контроллере следующим образом:
public ActionResult Save(int id, bool status){}
Где id
находится id
мой человек в БД и status
это значение, на которое checkbox
я нажал.
Итак, как мне вызвать эту функцию с помощью jquery, ajax или javascript и отправить эти параметры? Я не очень хорошо разбираюсь в ajax и немного его боюсь 🙂
И еще одна вещь, мне удается отображать значение флажка непосредственно из моей базы данных только таким образом:
@Html.CheckBox("somename", item.Status)
<input name="somename" type="hidden" value="false"/>
Любая помощь или совет или отправка меня в правильном направлении хороши!
Ответ №1:
У вас есть несколько вариантов. Одним из способов было бы поместить флажки в (обычную) форму, а затем использовать плагин формы jQuery для преобразования формы в Ajax:
@using(Html.BeginForm()) {
@Html.Checkbox(...)
}
<script type="text/javascript">
$(document).ready(function () {
$('form').ajaxForm({
success: Saved,
error: HandleError
});
});
function Error(response, status, err) {
// code to handle error here
}
function Saved(responseText, statusText, xhr, $form) {
// code to handle succes, if any
}
</script>
Вы могли бы, конечно, также использовать @Ajax.BeginForm
, но преимущество этого в том, что его легко понизить. Просто удалите инициализацию формы jQuery, и вы получите обычную форму : )
Другая возможность — просто использовать @Ajax.ActionLink
. Я написал сообщение в блоге о том, как справиться с Ajax.ActionLink
, которое, я думаю, поможет вам.
Подпись для вашего действия контроллера в вашем вопросе выглядит правильно:
public ActionResult Save(int id, bool status){}
Другой вариант на самом деле заключается в создании Settings
модели представления (называйте это как хотите), и там просто есть набор bool
свойств для представления флажков:
public class Settings
{
public bool Status { get; set; }
// more properties here
}
затем вы можете привязать свое действие к объекту настроек:
public ActionResult Save(int id, Settings settings){}
Это пригодится в случае, если в конечном итоге у вас будет несколько флажков для привязки.
Комментарии:
1. использование ajax actionlink кажется мне хорошим выбором, чтобы я мог установить ссылку ajax.action на свой флажок, а затем вызвать action и отправить параметры? Я читаю ваше сообщение в блоге и пытаюсь понять, возможно ли использовать его с моей функцией, в actionlink я могу отправить идентификатор и значение флажка?
2. @GoranB — Проблема с
ActionLink
в этом случае заключается в том, что вам понадобится ссылка «Сохранить» для каждого флажка . Это может быть не так уж плохо, если у вас есть толькоstatus
флажок, но может стать довольно загроможденным, если у вас их больше. И я думаю, что передача значения флажка динамически тоже может оказаться сложной…3. у меня есть статус и еще один флажок также из базы данных, так что, если бы вы могли написать пример actionlink для флажка и как отправить параметры?
4. @GoranB — В таком случае я бы определенно рекомендовал использовать
form
метод, либо с помощью плагина jQuery Form, либо с@Ajax.BeginForm
.5. Спасибо, хотя я и не воспользовался всеми советами, которые вы мне даете, вы указали мне на правильную идею, и я ее использую, мне удалось выполнить свою задачу без формы, используя только html.actionlink, это отлично работает, мне просто нужно добавить для моей следующей версии bool.