Чтение динамически генерируемого значения HTML-элемента в коде позади в ASP.NET - PullRequest
6 голосов
/ 28 декабря 2010

У меня есть страница asp.net, где у меня есть разметка ниже.По сути, эта разметка генерируется из кода, читая записи из таблицы и просматривая их циклически.Для каждой записи в таблице будет блок div.

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

<div id='divContainer' runat='server'>

 <div id='div1' runat='server'>
    <table>
      <tr>
        <th>Name</th>
        <td><input type='text' id='txtName1' value='something' /></td>
      </tr>
       </table>
 </div>
 <div id='div2' runat='server'>
    <table>
      <tr>
        <th>Domain name</th>
        <td><input type='text' id='txtName2' value='something' /></td>
      </tr>
     </table>
 </div>
 <div id='div3' runat='server'>
    <table>
      <tr>
        <th>URL</th>
        <td><input type='text' id='txtName3' value='something' /></td>
      </tr>
      </table>
 </div>
 <div id='div4' runat='server'>
    <table>
      <tr>
        <th>Some other value is enabled ?</th>
        <td><input type='checkbox' id='chk4'  /></td>
      </tr>
      </table>
 </div>

</div>

Идентификаторы каждого элемента ввода будут уникальными.Теперь в codebehind я хочу прочитать значения каждого элемента ввода, чтобы сохранить сделанные пользователем изменения.Как я могу прочитать элементы здесь?Так как разметка генерируется в codebehind в виде строки и добавляется к внутреннему HTML внешнего div, я не могу читать значения, как мы делаем для элемента управления, который мы перетаскиваем в IDE.

Ответы [ 5 ]

4 голосов
/ 28 декабря 2010

Если они отправляются обратно на страницу в стандартном HTTP POST, вы можете прочитать значения в Request.Form NameValueCollection.

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

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

1 голос
/ 28 декабря 2010

Если вы хотите получить значения для сгенерированных элементов управления, вам нужно сделать 2 вещи.

  1. Создать элементы управления вводом с тегом runat = 'server' для каждого элемента управления (в противном случаеони не будут включены в коллекцию Request.Forms.) Вероятно, этот шаг вы пропустили.

    <input type='text' id='txtName1' runat='server' value='something' />

  2. Получите ваши значения из коллекции Request.Form при обратной передаче

    string txtValue1 = Request.Form["txtName1"];

Это действительно должно быть так просто.Я проверил это на вашем коде, используя DIV в качестве контейнера и простой javascript для вставки управляющей строки во innerHTML.Если у вас возникли какие-либо проблемы, вам, возможно, придется отладить и посмотреть, изменился ли идентификатор динамического элемента управления из-за вставки их в контейнер имен или что-то еще.

0 голосов
/ 28 декабря 2010

Таким образом, основная проблема в том, что когда вы динамически добавляете элемент управления после Page_Init, значения POSTBACK не могут быть вставлены обратно в эти элементы управления.

CF: http://www.15seconds.com/issue/020102.htm и http://msdn.microsoft.com/en-us/library/ms178472.aspx

Некоторые другие ответы здесь предлагают "о, добавьте сервер runat = в элемент управления", но когда вы создаете его вв коде, а не в Page_Init, тогда это имеет значение ZERO.

Дайте мне знать, если это не , как вы создаете элементы управления или не какВы используете их, и я уточню этот ответ более подробно.На самом деле все сводится к тому, как вы пытаетесь получить доступ к значениям.

0 голосов
/ 28 декабря 2010

Я не тестировал, но могу предложить следующее:

Добавьте ваши динамические элементы управления с тегом runat = "server" в другие элементы управления с помощью runat = "server" (например, панель управления). Тогда вы можете получить к ним доступ так:

Textbox t = (Textbox)panel1.controls.findControl("dynamicControlId");
0 голосов
/ 28 декабря 2010

Как правило, вы помещаете те элементы управления вводом, которые вы создаете динамически (в данном случае, TextBox), во что-то вроде элемента управления панели (контейнера).Затем, после того как пользователь опубликовал свои данные, вы зациклите этот контейнер panel.Controls collection и получите каждый текст TextBox.

Имейте в виду, что некоторые предостережения применяются при работе с динамически создаваемыми элементами управления, поскольку ASP имеет значение без состояния nature.

На этой странице показано, как это реализовать:

Добавление динамических строк в элемент управления ASP.Net GridView с TextBoxes

...