2010-12-28 3 views
6

У меня есть страница asp.net, где у меня есть следующая разметка. В основном эта разметка генерируется из кода, читая записи из таблицы и перебирая их. Для каждой записи в таблице будет div-блок.Чтение динамически созданного значения элемента HTML в коде в ASP.NET

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

<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 я хочу прочитать значения каждого элемента ввода, чтобы сохранить сделанные изменения. Как я могу прочитать элементы здесь? Поскольку разметка генерируется в коде в качестве строки и добавляется INNER-код внешнего div, я не могу читать значения, как мы это делаем для элемента управления, который мы перетаскиваем в среду IDE.

+0

Как вы добавляете элементы управления? Как струны? Как серверные элементы управления (добавление в коллекцию 'Controls'? Что-то еще? – Oded

+0

Что происходит, когда вы делаете элементы управления runat =« server »? Не можете до них добраться? – Pabuc

+3

Вам может быть интересно узнать, что ваши элементы' table' – David

ответ

4

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

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

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

+0

Динамически добавленные элементы не будут переведены обратно в серверные элементы управления tho. Поэтому он не может искать 'txtName3.Text' в коде serveride. Ему придется разобрать этот NVC, иначе ему понадобится другой способ перестроить данные запроса в форму. – jcolebrand

+0

@drachenstern: Они не серверные элементы управления, нет. Но значения присутствуют в 'Request.Form' и могут быть легко вытащены по имени элемента. Что касается сохранения их на динамической странице, это займет определенную работу. Но основная идея получения значений в postback может работать так же, как получение значений формы практически на любом другом серверном языке. – David

+0

Верно, следовательно, мой ответ, что это зависит от того, как он хочет их использовать. Если он ожидает 'txtName3.Text', это не сработает. Я думаю, что вы и я здесь согласны, я просто не думаю, что он понимает жизненный цикл страницы, или он не хочет использовать механизм ASP.NET так, как это делают все остальные. Если уж на то пошло, я просто использовал gridview или что-то подобное с командами и делал с ним. Намного проще. – jcolebrand

0

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

Помните, что при работе с динамически создаваемыми элементами управления применяются некоторые оговорки, поскольку ASP имеет размер stateless.

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

Adding Dynamic Rows in ASP.Net GridView Control with TextBoxes

-1

Я не проверял, но я могу предположить, что:

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

Textbox t = (Textbox)panel1.controls.findControl("dynamicControlId"); 
+1

Динамически добавленные элементы управления по определению запускаются на сервере для начала. О, неважно, строки по сути НЕ контролируют. Я вижу ваш вопрос, но он все равно не сработает. – jcolebrand

+0

вы не можете сделать это, так как ни один из элементов управления не является серверной стороной. – Pabuc

+0

Хорошо, я уже сказал, что: я не тестировал его. Благодарю. – mavera

0

Так тяжесть истории в том, что, когда вы динамически добавить элемент управления после 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

Я читаю записи из таблицы и перебираю через нее. Создавая строку, которая имеет разметку, а затем присваивает внутреннему свойству HTML внешнего div. – Shyju

+0

Нет, как вы их используете при обратной передаче? Вы читаете 'txtName3.Text'? – jcolebrand

+0

на самом деле это делает, всякий раз, когда вы создаете элемент управления на codebehind, это наверняка является сервером. OP не создает «create control» serverside вместо этого изменяет innerHtml управления сервером. – Pabuc

1

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

  1. Генерировать управления вводом с RUNAT = тега «сервер» для каждого элемента управления (в противном случае они не будут включены в сборник Request.Forms.) Это, вероятно, шаг ваш отсутствующий.

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

  2. Хватай значения из коллекции Request.Form на постбэка

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

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

Смежные вопросы