Asp.Net Добавить UserControl на страницу - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть веб-сайт ASP.Net, и на одной из страниц я использую повторитель для рендеринга нескольких итераций UserControl, который UserControl содержит второй UserContol с двумя текстовыми полями, в которые мой пользователь должен вводить информацию. Я хочу, чтобы мой пользователь нажал кнопку и добавил еще один экземпляр второго UserControl (с двумя текстовыми полями) в мой оригинальный UserControl, чтобы у пользователя было 4 текстовых поля, отображаемых на экране для первого UserControl. Проблема, которую я вижу, если я пытаюсь добавить второй UserControl к данной итерации первой, состоит в том, что обратная передача страницы вызывает удаление любого из этих вторых пользовательских элементов управления со страницы.

Кто-нибудь знает способ сделать это с помощью JQuery? У меня было три публикации, в которых описано, как решить эту проблему с помощью динамических элементов управления на стороне сервера и / или AJAX, но мы решили сосредоточиться на решении JQuery, поскольку этот механизм на стороне сервера слишком дорог для нас.

Я работал над предложением Zincorp ниже, и теперь у меня есть JQuery, работающий для клонирования текстового поля, но испытывающий затруднения при использовании коллекции Request.Form на стороне сервера для перебора элементов управления. Кто-нибудь может рассказать о том, как перебрать коллекцию Request.Form?

ОК, я думаю, что проблема с переборами элементов управления с использованием коллекции Request.Form.AllKeys заключалась в том, что я использовал текстовое поле HTML, а не элемент управления ASP TextBox. Очевидно, коллекция Request.Forms.AllKeys содержит только элементы управления ASP, а не элементы управления HTML.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я клонирую элемент управления в JQuery, а затем отправляю свою страницу с помощью кнопки отправки, 2 элемента управления имеют одинаковый идентификатор и поэтому (я думаю) объединяются по http в один ASP TextBox Элементы управления, содержащие оба значения, с разделителем-запятой (например, 40,20). Кто-нибудь знает, как получить новый идентификатор, назначенный клонированному ASP TextBox?

Вот обновленная разметка в примере веб-приложения ASP.Net:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"   Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
        <asp:Label runat="server" ID="ProjectDisplay" Text="Project" />
        <asp:TextBox ID="ProjectValue" runat="server" ></asp:TextBox>
        <div id="mydiv" ></div>
        <br />
        <br />
        <br />

    <input id="AddProject" type="button" value="Add Project" />    
        <br />
        <br />


    <asp:Button ID="Submit" runat="server" Text="Submit" onclick="Submit_Click" />

</div>
</form>
</body>
</html>
<script language="jquery" src="js/jquery-1.3.2.js" type="text/javascript"></script>
<script type="text/javascript" >

$(document).ready(function() {

  $("#AddProject").click(function() {

      var x = $("#ProjectValue").clone();

      x.appendTo("#mydiv");     
  });
});
</script>

А вот обновленный код на стороне сервера, где я пытаюсь перебрать элементы в коллекции Request.Form для получения информации:

public partial class _Default : System.Web.UI.Page 
{
protected void Submit_Click(object sender, EventArgs e)
{
    foreach (string s in Request.Form.Keys)
    {
        object x = Request.Form[s];
    }
}

}

Ответы [ 4 ]

1 голос
/ 15 февраля 2010

Прежде чем выбрать решение проблемы, сначала рассмотрите проблему:

Вам необходимо:

1) Двойные элементы управления / разметка на стороне клиента

2) Получить эти значения на стороне сервера при обратной передаче

3) Для каждого из добавленных «пользовательских элементов управления» на стороне клиента добавьте их в качестве дочерних элементов первого пользовательского элемента управления на стороне сервера.

Я не собираюсь давать код, но вот несколько идей:

1) Используйте метод jQuery .clone () (http://api.jquery.com/clone/), чтобы продублировать разметку, отображаемую в пользовательском контроле, содержащем текстовые поля. Возможно, оберните их в div без runat = "server", чтобы вы могли легко получить его по идентификатору. Вероятно, вам потребуется рекурсивно перебрать дочерние элементы в клонированном элементе и добавить к ним знак #, чтобы избежать конфликтующих идентификаторов (например, nameTextBox_1, nameTextBox_2 и т. д.)

2) При обратной передаче используйте коллекцию Request.Form на стороне сервера для получения значений текстового поля. Итерируйте по нему и поймайте все элементы, ключи которых начинаются с «nameTextBox _».

3) Для каждого добавленного «пользовательского элемента управления» на стороне клиента создайте фактический пользовательский элемент управления на стороне сервера, присвойте ему значения, введенные в текстовые поля, а затем добавьте его в дочерние элементы управления первого. Таким образом, состояние сохраняется после возврата пользователю.

1 голос
/ 11 февраля 2010

Короткий ответ: вам нужно будет добавить элементы управления до инициализации ViewState.

В видео на этом сайте есть хорошее руководство по добавлению динамических элементов управления. http://www.asp.net/%28S%28wnmvzu45umnszm455c1qs522%29%29/learn/ajax-videos/video-286.aspx

1 голос
/ 12 февраля 2010

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

Вообще говоря, ViewState отвечает только за восстановление STATE в существующих элементах управления (отсюда и название). Он не несет ответственности за воссоздание элементов управления.

0 голосов
/ 11 февраля 2010

Я полагаю, вы испытываете проблемы с состоянием зрения. Ваши динамические элементы управления не сохраняются. Если вы еще этого не сделали, прочитайте отличную статью Дейва Рида Истинное понимание Viewstate . Обратите особое внимание на раздел «5. Инициализация динамически создаваемых элементов управления программно», который относится к проблеме, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...