![](/img/trans.png)
[英]Clearing control values in a page without postback from the server ASP.NET
[英]Force asp.net page postback from server
我有一個在后面的代碼中完全動態創建的頁面(哦,快樂)。
在此頁面上按下按鈕時,會向頁面添加更多元素 - 這很好,但是,刷新的頁面直到下一次回發才會出現。 我會做一個重定向,但我想保留在現有控件中輸入的任何數據的 state。
所以 - 我需要從代碼后面的服務器代碼強制回發。 我想這涉及到插入一些 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;
}
}
您單擊按鈕並添加更多控件。 這比我遇到問題的頁面要簡單得多,但它說明了我遇到的問題。
回發不是必需的,而且有點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;
}
}
使用請求 forms 列表來搜索唯一控件 ID 類似下面這個鏈接的東西,最后一個帖子,不確定他的代碼是否完全正確,但你會明白的。
在 Request.Form 中搜索控件/解析 NameValueCollection
為您的控件提供唯一 ID,您可以在回發時搜索它們。
另外,我使用在 ID 中添加其他內容以讓回發搜索知道它是什么類型的控件,例如添加 txt_firstname,我知道 firstname 是一個 txtbox。 使用正則表達式搜索返回的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.