Почему я не вижу никаких данных в HtmlTables даже при включенном runat = server? - PullRequest
0 голосов
/ 13 мая 2011

У меня есть две таблицы HTML, первая заполняется на стороне сервера посредством записей в базе данных, а вторая заполняется через клиентский Javascript, который позволяет пользователю динамически добавлять строки и вводить данные через текстовые поля ввода.

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

<table style="display: none; width: 100%" runat="server" id="tblWebOrderArbitraryContacts" class="borderBottomStyle">
                                            <table runat="server" id="recipientTable" style="display: block; width: 100%" class="borderBottomStyle"></table>



//the problem is the row count is always zero, regardless of what data is in it

if(tblWebOrderArbitraryContacts.Rows != null && tblWebOrderArbitraryContacts.Rows.Count > 0)
            {
                //go through automatically derived (from integrations) contacts
                foreach (HtmlTableRow row in tblWebOrderArbitraryContacts.Rows)
                {
...

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

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

Я подозреваю, что у вас похожая проблема с таблицей, которая заполнена кодом на стороне сервера. Если вы не храните запись ваших изменений в объявленной разметке где-либо (viewstate, session и т. Д.), То сервер не имеет представления о том, что было сгенерировано предыдущим запросом, и возвращается к объявленной разметке.

Посмотрите на некоторые статьи о динамическом объявлении элементов управления для более глубокого объяснения. http://www.4guysfromrolla.com/articles/081402-1.aspx#postadlink дают довольно хорошее представление о том, что происходит, хотя используемые методы и примеры немного устарели.

0 голосов
/ 13 мая 2011

Объяснение

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

Когда вы отправляете запрос «post» обратно на сервер («Postback»), страница просматривает коллекцию форм запроса (данные из тегов , отправленных браузером), и пытается обновить веб-элементы управления на странице данными, найденными в этой коллекции форм.

Кроме того, но помимо этого, элементы управления с поддержкой состояния просмотра могут пытаться заполнитьсами основаны на данных, найденных в viewstate, оставленном другим экземпляром того же элемента управления из предыдущего запроса.

В частности, если вы посмотрите на WebBontrol TextBox, вы увидите, что он реализует интерфейс IPostBackDataHandler.В начале запроса страница просматривает все значения в коллекции форм, представленные запросом.Когда страница находит значение в коллекции форм, ключ которой соответствует идентификатору элемента управления TextBox, страница может применить это обновленное значение к этому элементу управления TextBox, используя метод LoadPostData интерфейса IPostBackDataHandler.

ЗвучитНапример, вы добавляете несколько строк данных в таблицу и отправляете их все на сервер одновременно.Вы можете сделать это, но проблема в том, что на вашей странице нет элементов управления, которые могли бы служить целями для этих данных.В частности, вам нужно назначить атрибут name ваших тегов , чтобы данные были отправлены на сервер, но что бы вы указали в качестве значения атрибута name?Это не будет соответствовать элементу управления на вашей странице.Кроме того, если вы отправляете несколько строк одновременно, как бы вы отличали одну от другой?

Возможное решение

Предполагая, что ваша страница после манипуляций с JavaScript и пользовательского ввода выглядит примерно так:

<table>
  <thead><tr></th>First Name</th><th>Last Name</th></tr></thead>
  <tbody>
    <tr><td><input name="FirstName[0]" value="John" /></td><td><input name="LastName[0]" value="Smith" /></td></tr>
    <tr><td><input name="FirstName[1]" value="Jane" /></td><td><input name="LastName[1]" value="Doe" /></td></tr>
    <tr><td><input name="FirstName[2]" value="Spider" /></td><td><input name="LastName[2]" value="Man" /></td></tr>
  </tbody>
</table>

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

string firstName = Request.Form["FirstName[0]"];
string lastName = Request.Form["LastName[0]"];

Вы также можете сделать что-то вроде этого:

int index = 0;
bool dataFound;
do
{
  dataFound = false;

  string firstName = Request.Form["FirstName["+index+"]"];
  if (firstName != null)
    dataFound = true;

  string lastName = Request.Form["LastName["+index+"]"];
  if (lastName != null)
    dataFound = true;

  // do something with firstName and lastName ...

  index++;
} while (dataFound);
...