Принудительная обратная передача страницы asp.net с сервера - PullRequest
0 голосов
/ 09 июня 2011

У меня есть страница, которая создается полностью динамически в коде позади (о, радость).

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

Итак - мне нужно вызвать обратную передачу с кода сервера за кодом. Я полагаю, что это включает в себя вставку некоторого js-кода, но кроме этого я совсем не испытывал радости.

Вот пример, чтобы прояснить ситуацию:

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

<!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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>  
    </div>
    </form>
</body>
</html>

Очень простая страница.

Код также прост:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["data"] = 1;
        }

        PopulatePage();
    }

    private void PopulatePage()
    {
        int data = (int)Session["data"];

        for (int n = 0; n < data; ++n)
        {
            TextBox tb = new TextBox();
            tb.ID = n.ToString();
            PlaceHolder1.Controls.Add(tb);
            Literal lit = new Literal();
            lit.Text = "<br/>";
            PlaceHolder1.Controls.Add(lit);
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        int data = (int)Session["data"];



Session["data"] = ++data;


   }
}

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

Ответы [ 2 ]

0 голосов
/ 20 июня 2011

Постбэк не нужен и немного похож на hack, лучше было бы исправить проблему в корне.

private void PopulatePage()
{
    for (int n = 0; n < Counter; n++)
    {
        CreateSingleControl(n);
    } 
}

private void CreateSingleControl(int index)
{
    TextBox tb = new TextBox();
    tb.ID = String.Format("text{0}", index);
    PlaceHolder1.Controls.Add(tb);
    Literal lit = new Literal();
    lit.Text = "<br/>";
    PlaceHolder1.Controls.Add(lit);

}

protected override void CreateChildControls()
{
    PopulatePage();
    base.CreateChildControls();
}
protected void Button1_Click(object sender, EventArgs e) {
    CreateSingleControl(Counter);
    Counter++;

}

private int Counter
{
    get
    {
        return Counter = (int)(ViewState["data"] ?? 1);
    }
    set
    {
        ViewState["data"] = value;
    }
}
0 голосов
/ 09 июня 2011

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

Поиск элементов управленияв Request.Form / Парсинг NameValueCollection

Дайте вашим элементам управления уникальные идентификаторы ', и вы можете искать их на обратной передаче.

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

...