Какой лучший способ отправить много флажков клиенту в ASP.Net?

StackOverflow https://stackoverflow.com/questions/235608

Вопрос

У меня следующая ситуация:

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

В классическом ASP / PHP я могу создать множество элементов управления с именем " chk __ * " и затем при обратной передаче просмотрите все записи $ POST, ища те с префиксом " chk ".

Каков наилучший способ сделать это в ASP.Net 2.0?

Я могу легко это сделать, внедрив Repeater с шаблоном, содержащим флажок, привязав Repeater к набору данных, а затем на втором Postback, я просто делаю:

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

Однако, у этого небольшого недостатка является предоставление мне ОГРОМНОГО Viewstate, что очень плохо, потому что клиенту нужно будет повторно загрузить все viewstate на сервер, и эти люди, вероятно, будут использовать мой сайт через дерьмовую связь.

Есть еще идеи? (Я также могу динамически создавать элементы управления и выполнять итерации по Request.Form, как и в прежние времена, однако я искал уборщика

Это было полезно?

Решение

Делайте это так же, как в классическом ASP. Используйте & Lt; input type = & Quot; флажок & Quot; & Gt; вместо < asp: checkbox > ;. Вы можете получить доступ к необработанным параметрам post, используя Request.Form

Другие советы

Вы смотрели на элемент управления CheckBoxList? Вы можете привязать его к своему набору данных, предоставить текстовые и ценностные элементы, и это также позволит вам легко увидеть, какие элементы проверяются. Также есть возможность динамически добавлять дополнительные элементы-флажки, если это необходимо.

Я рекомендую классическое решение ASP, когда сталкиваюсь с абсурдными условиями Viewstate. Печально потерять приятные функции, которые он предоставляет, но объединяет некоторые элементы управления с поддержкой Viewstate (asp: *) с некоторыми классическими приемами (input type = & Quot; ... & Quot; ) избавил меня от много головных болей в прошлом.

Иногда вы просто хотите сделать что-то простое, и простое решение превосходит " WYSIWYG " редактирование формы.

Одна из вещей, которые я сделал, - записал состояние проверки через AJAX в сеансе, затем в режиме обратной передачи (полное или частичное через AJAX), найдите в сеансе элементы, для которых нужно выполнить выбранное действие.

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

Этот способ также позволяет обрабатывать выгружаемые данные, поскольку вы можете установить начальное значение флажка из сеанса при отображении (полной или частичной) страницы с отмеченными элементами на ней.

Это может выглядеть примерно так. Предполагается ASP.NET AJAX с PageMethods (и, конечно, ScriptManager).

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

Отключить ViewState. Если это невозможно, попробуйте использовать сессию, чтобы сохранить просмотреть состояние

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top