我一直在使用Web Forms一段時間,現在我已閱讀了大部分我在Google上發現的相關內容。但是,我仍然不清楚如何正確處理這個問題。我喜歡this answer中的圖片,但發現它有點過於通用。我還沒有找到一個體面的,具體的例子來說明如何處理這些事件。c#如何正確使用Page_init,ViewState和Page_Load?
我在代碼中動態在Page_Load事件目前正在創建幾個控件後面:
foreach (Service service in Services)
{
// service div
HtmlGenericControl serviceDiv = new HtmlGenericControl("div");
serviceDiv.ID = service.ID;
serviceDiv.Style.Add(HtmlTextWriterStyle.TextAlign, "center");
outerDiv.Controls.Add(serviceDiv); //outerDiv exists in the aspx page
// service updatepanel
UpdatePanel uPanel = new UpdatePanel()
{
ID = service.ID + "_uPanel",
UpdateMode = UpdatePanelUpdateMode.Conditional
};
serviceDiv.Controls.Add(uPanel);
// status span
HtmlGenericControl statusSpan = new HtmlGenericControl("span");
statusSpan.ID = service.ID + "_statusSpan";
statusSpan.InnerHtml = service.Status;
uPanel.ContentTemplateContainer.Controls.Add(statusSpan);
// show specific content
if (service.Status.Equals(ServiceControllerStatus.Running.ToString()))
{
// status color
statusSpan.Attributes.Add("class", "status-run");
// stop button
HtmlButton stopButton = new HtmlButton();
stopButton.ID = service.ID + "_btnStop";
stopButton.InnerHtml = "<i class=\"fa fa-stop btn-red\"/></i>";
stopButton.Attributes.Add("type", "button");
stopButton.Attributes.Add("runat", "server");
stopButton.Attributes.Add("class", "btn btn-link btn-xs");
stopButton.Attributes.Add("title", "Stop");
stopButton.ServerClick += new EventHandler(BtnStop_Click);
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(stopButton);
uPanel.ContentTemplateContainer.Controls.Add(stopButton);
// restart button
HtmlButton restartButton = new HtmlButton();
restartButton.ID = service.ID + "_btnRestart";
restartButton.InnerHtml = "<i class=\"fa fa-refresh btn-blue\"/></i>";
restartButton.Attributes.Add("type", "button");
restartButton.Attributes.Add("runat", "server");
restartButton.Attributes.Add("class", "btn btn-link btn-xs");
restartButton.Attributes.Add("title", "Restart");
restartButton.ServerClick += new EventHandler(BtnRestart_Click);
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(restartButton);
uPanel.ContentTemplateContainer.Controls.Add(restartButton);
}
else
{
// status color
statusSpan.Attributes.Add("class", "status-stop");
// start button
HtmlButton startButton = new HtmlButton();
startButton.ID = service.ID + "_btnStart";
startButton.InnerHtml = "<i class=\"fa fa-play btn-green\"/></i>";
startButton.Attributes.Add("type", "button");
startButton.Attributes.Add("runat", "server");
startButton.Attributes.Add("class", "btn btn-link btn-xs");
startButton.Attributes.Add("title", "Start");
startButton.ServerClick += new EventHandler(BtnStart_Click);
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(startButton);
uPanel.ContentTemplateContainer.Controls.Add(startButton);
}
// version span
HtmlGenericControl versionSpan = new HtmlGenericControl("span");
versionSpan.ID = service.ID + "_version";
versionSpan.InnerHtml = service.Version;
versionSpan.Attributes.Add("class", "version-text");
serviceDiv.Controls.Add(versionSpan);
我會在Page_Init創建這些收穫是什麼?如果我在Page_Init中創建它們,我如何在Page_Load中訪問它們?私人全球名單UpdatePanel
s和HtmlButton
s感覺很不潔淨。
我知道ViewState會在Page_Init和Page_Load之間加載,但這真的意味着什麼?由於我沒有進行完整的回發,而是使用RegisterAsyncPostBackControl
僅在回發時更新UpdatePanel
,我不需要重新填充Page_Load?
我很驚訝警方沒有圍着你的問題過於籠統!無論如何,我無法在評論中給出關於WebForms的教程,但我會考慮將控件添加到頁面標記中。例如,您可能有一個Repeater,其模板包含服務的所有按鈕和跨度。然後將數據綁定到包含有關您的服務的相關數據的對象列表。我將使模板中存在所有控件,並使用數據綁定表達式設置其可見性。例如。開始和停止按鈕的可見性將由服務狀態控制。 – Joe
@Joe我意識到標題有點泛泛,我可以添加一個「以我的情況」,但似乎很明顯,至少對我來說是這種情況。然而,問題本身顯然集中在我的代碼上,將它放在'Page_Load'上的'Page_Init'中會帶來什麼好處。爲什麼以及如何影響ViewState,以及我是否真的需要它。 我也建議在實際的答案,而不是與「我不能給一個評論中的WebForms的教程」去。我甚至沒有轉發器等等(這對Webforms來說是多麼的新鮮),所以一個徹底的答案將會受到重視。 – Skillzore
@Skillzone,馬庫斯給出了一個很好的答案,我剛剛提出。基本上與上述相同的建議,但寫得更好。避免動態創建控件,而是將控件包含在ASPX標記中,使用Repeater並根據需要設置控件的Visible屬性。你說你還沒有得到中繼器:如果是這樣的話,我建議你在嘗試瞭解如何動態添加控件之前先學習中繼器和數據綁定。 – Joe