none
MVC 2 - checkboxes RRS feed

  • Вопрос

  • Уважаемые знатоки. Есть форма в которой таблицей выводяться данные из SQL базы с помощь LINQ to SQL класса. помимо этого финальный столбец - input typ="checkbox" name = "checkme". при нажатии кнопки удалить на странице должны удалить все выбранные записи чекбоксом - по умолчанию переменной checkme передается только 1(причем первое выбранное значение). 1 - как вытащить все checked чекбоксы, 2. почему то в цикл удалени не заходит хотя цикл сделан без ошибок)

    тестовый цикл удаления:


     else if (submit == "Удалить")
                {
                    foreach (var Ch in checkme)
                    {
                        var userRow = from t in mDC.user_info where (t.id == Convert.ToInt32(Ch)) select t;
                        foreach (user_info t in userRow)
                        {
                            mDC.user_info.DeleteOnSubmit(t);
                            mDC.SubmitChanges();
                        }

                    }
                    return RedirectToAction("Table");
                }

    21 апреля 2011 г. 8:05

Ответы

  • Назову его метод для нубов - итак простое задание есь форма которая выводит в таблицу данные из SQL таблицы. с данными работаем посредством LINQ to SQL.

    итак сама форма:

     

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    <%@ Import Namespace="Test2App" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    	Table
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
     <form id="form1" onclick="f_ch()" method="post" action="/home/table">
     <table id="DataTable" border = 2 cellpadding = 0 cellspacing = 0>
     <%foreach (var t in ViewData.Model)
      { %>
     <tr>
     <td><%= t.id %></td>
     <td><%= t.Name %></td>
     <td><%= t.Adress %></td>
     <td><%= t.Telephone %></td>
     <td><input type="checkbox" name="checkme" value="<%= t.id %>"/></td>
     </tr>
     <%} %>
     </table>
     <br />
     <p>
     <input type = "hidden" name = "first_checked" value=1000000 />
     <input type = "submit" name ="submit" value = "Изменить" />
     <input type = "submit" name ="submit" value = "Создать"
     <input type = "submit" name ="submit" value = "Удалить" />
     </p>
    </form>
    </asp:Content>
    

     

    следует заменить что свойство формы onclick тут лишне, просто не прошерстил код после того как пытался отлавливать checkbox'ы яваскриптом.Так же как и скрытое поле first_check, оно не используется в этой реализации его смело можно удалять и контекста.

    3 кнопки под именем submit чтобы знать какие действия мы будем выполнять. - изменение, удаление и создание записи.

    Далее код контролера Table( полный код приложения приводить не буду):

     

    public ActionResult Table(string submit, ICollection<string> checkme)
      {
       if (submit == "Создать")
       {
        return RedirectToAction("table_add");
       }
       else if (submit == "Изменить")
       {
        foreach (var check in checkme)
        {
         if (checkme != null)
         {
          return RedirectToAction(check, "Home/table_edit");
         }
         else
         {
          break;
         }
        }
        return RedirectToAction("Table");
       }
       else if (submit == "Удалить")
       {
        foreach (var Ch in checkme)
        {
         var userRow = from t in mDC.user_info where (t.id == Convert.ToInt32(Ch)) select t;
         foreach (user_info t in userRow)
         {
          mDC.user_info.DeleteOnSubmit(t);
          mDC.SubmitChanges();
         }
    
        }
        return RedirectToAction("Table");
       }
       else
       {
    
        var userTable = from t in mDC.user_info select t;
        return View(userTable);
       }
      }
    

     

    Итак, передаем чекбоксы коллекцией контроллеру, следует заметить, что в коллекции передаются только чекбоксы с checked=true. а далее имея коллекцию нам нетрудно отыскать первый отмеченный чекбокс либо же удалить записи по всем отмеченным вместе чекбоксам.

    Заранее предупреждаю, я начинающий разработчик. Код может быть ошибкоопасен или выдавать исключения. Код не оптимизирован и не прошел рефакторинг - это просто тестовый пример для понимания общей логики работы данной операции.


    • Изменено n1ks2n 21 апреля 2011 г. 13:24 Пропустил пояснение
    • Помечено в качестве ответа Abolmasov DmitryModerator 21 апреля 2011 г. 13:47
    21 апреля 2011 г. 13:23

Все ответы

  • Спасибо за внимание зарылся в форум и документацию - нашел ответ. Если кому интересно могу выложить.
    21 апреля 2011 г. 8:30
  • Выкладывайте
    Для связи [mail]
    21 апреля 2011 г. 10:33
    Модератор
  • Назову его метод для нубов - итак простое задание есь форма которая выводит в таблицу данные из SQL таблицы. с данными работаем посредством LINQ to SQL.

    итак сама форма:

     

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    <%@ Import Namespace="Test2App" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    	Table
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
     <form id="form1" onclick="f_ch()" method="post" action="/home/table">
     <table id="DataTable" border = 2 cellpadding = 0 cellspacing = 0>
     <%foreach (var t in ViewData.Model)
      { %>
     <tr>
     <td><%= t.id %></td>
     <td><%= t.Name %></td>
     <td><%= t.Adress %></td>
     <td><%= t.Telephone %></td>
     <td><input type="checkbox" name="checkme" value="<%= t.id %>"/></td>
     </tr>
     <%} %>
     </table>
     <br />
     <p>
     <input type = "hidden" name = "first_checked" value=1000000 />
     <input type = "submit" name ="submit" value = "Изменить" />
     <input type = "submit" name ="submit" value = "Создать"
     <input type = "submit" name ="submit" value = "Удалить" />
     </p>
    </form>
    </asp:Content>
    

     

    следует заменить что свойство формы onclick тут лишне, просто не прошерстил код после того как пытался отлавливать checkbox'ы яваскриптом.Так же как и скрытое поле first_check, оно не используется в этой реализации его смело можно удалять и контекста.

    3 кнопки под именем submit чтобы знать какие действия мы будем выполнять. - изменение, удаление и создание записи.

    Далее код контролера Table( полный код приложения приводить не буду):

     

    public ActionResult Table(string submit, ICollection<string> checkme)
      {
       if (submit == "Создать")
       {
        return RedirectToAction("table_add");
       }
       else if (submit == "Изменить")
       {
        foreach (var check in checkme)
        {
         if (checkme != null)
         {
          return RedirectToAction(check, "Home/table_edit");
         }
         else
         {
          break;
         }
        }
        return RedirectToAction("Table");
       }
       else if (submit == "Удалить")
       {
        foreach (var Ch in checkme)
        {
         var userRow = from t in mDC.user_info where (t.id == Convert.ToInt32(Ch)) select t;
         foreach (user_info t in userRow)
         {
          mDC.user_info.DeleteOnSubmit(t);
          mDC.SubmitChanges();
         }
    
        }
        return RedirectToAction("Table");
       }
       else
       {
    
        var userTable = from t in mDC.user_info select t;
        return View(userTable);
       }
      }
    

     

    Итак, передаем чекбоксы коллекцией контроллеру, следует заметить, что в коллекции передаются только чекбоксы с checked=true. а далее имея коллекцию нам нетрудно отыскать первый отмеченный чекбокс либо же удалить записи по всем отмеченным вместе чекбоксам.

    Заранее предупреждаю, я начинающий разработчик. Код может быть ошибкоопасен или выдавать исключения. Код не оптимизирован и не прошел рефакторинг - это просто тестовый пример для понимания общей логики работы данной операции.


    • Изменено n1ks2n 21 апреля 2011 г. 13:24 Пропустил пояснение
    • Помечено в качестве ответа Abolmasov DmitryModerator 21 апреля 2011 г. 13:47
    21 апреля 2011 г. 13:23
  • Сразу замечу что ничего сверхестественного в коде нету, но в этом и вся проблема - по данному материалу не так просто найти удобоваримые решения для тривиальных проблем новичкам, чтобы не застопориваться и быстрее развиваться и узнавать новые технологии.
    21 апреля 2011 г. 13:29