Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 强制asp.net页面从服务器回发_Javascript_Asp.net_Postback_Dynamic Controls - Fatal编程技术网

Javascript 强制asp.net页面从服务器回发

Javascript 强制asp.net页面从服务器回发,javascript,asp.net,postback,dynamic-controls,Javascript,Asp.net,Postback,Dynamic Controls,我有一个完全在代码隐藏(oh joy)中动态创建的页面 在按下此页面上的按钮时,会向页面添加更多元素-这很好,但是,刷新的页面直到下一次回发时才会显示。我将执行重定向,但我希望保留在现有控件中输入的任何数据的状态 所以-我需要强制从服务器回发代码隐藏代码。我想这需要插入一些js代码——但除此之外,我一点也不高兴 下面是一个让事情更清楚的例子: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.

我有一个完全在代码隐藏(oh joy)中动态创建的页面

在按下此页面上的按钮时,会向页面添加更多元素-这很好,但是,刷新的页面直到下一次回发时才会显示。我将执行重定向,但我希望保留在现有控件中输入的任何数据的状态

所以-我需要强制从服务器回发代码隐藏代码。我想这需要插入一些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;


   }
}
使用系统;
使用System.Collections.Generic;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
公共部分类Default2:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
会话[“数据”]=1;
}
PopulatePage();
}
私有void PopulatePage()
{
int data=(int)会话[“data”];
对于(int n=0;n”;
占位符1.控件.添加(亮起);
}
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
int data=(int)会话[“data”];
会话[“数据”]=++数据;
}
}

单击该按钮,将添加更多控件。这比我遇到问题的页面简单得多,但它演示了我遇到的问题。

使用请求表单列表搜索唯一控件ID 类似下面的链接,最后一篇文章,不确定他的代码是否完全正确,但你会明白的

为控件提供唯一ID,您可以在回发中搜索它们


另外,我还向ID添加了其他内容,以让回发搜索知道它是什么类型的控件,比如添加txt_firstname,我知道firstname是一个txtbox。使用regex搜索返回的字符串。

不需要回发,而且有点像
黑客
,最好从根本上解决问题

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;
    }
}
private void PopulatePage()
{
用于(int n=0;n”;
占位符1.控件.添加(亮起);
}
受保护的覆盖无效CreateChildControls()
{
PopulatePage();
base.CreateChildControls();
}
受保护的无效按钮1\u单击(对象发送者,事件参数e){
CreateSingleControl(计数器);
计数器++;
}
专用整数计数器
{
收到
{
返回计数器=(int)(视图状态[“数据”]??1);
}
设置
{
ViewState[“数据”]=值;
}
}

如果在按下按钮时运行服务器代码,则表示已经有回发。我知道,我需要生成另一个回发。按下一个按钮(第一次回拨),页面将添加另一个控件-但这在另一次回拨之前不会出现…为什么不能用第一次回拨更新页面?它在第一次回拨时更新-但是,我将详细介绍。在页面加载功能中,根据数据库填充控件。因此,按下按钮后,将填充控件(根据需要),然后更新数据库。我不能再次调用“填充”按钮,因为它会复制控件ID,除非我清除屏幕上的现有控件,然后我会丢失这些值。但在下一次回发时,数据库是最新的,页面会自行填充。我将尝试创建一个简单的示例来发布。您如何尝试使按钮单击/页面加载(以最后运行的为准,猜测按钮单击)更智能一些?如果是按钮单击,您可以为新项目创建控件(在您的示例中,再添加一个控件),如果是另一个,我看不出问题所在。这实际上似乎与问题无关。所有控件都有唯一的ID,我在需要时可以毫无问题地找到控件的值,即使它们都是动态生成的。