asp.net mvc сохранить значение флажка в базе данных

#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.