私はWebフォームを短期間使っています。私はこれについて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
とHtmlButton
のプライベートグローバルリストはとても汚れているように感じます。
私はViewStateがPage_InitとPage_Loadの間に読み込むことを知っていますが、それは実際にはどういう意味ですか?私は完全なポストバックを行いませんが、代わりにRegisterAsyncPostBackControl
を使用してUpdatePanel
のポストバックを更新するだけなので、Page_Loadで再設定する必要はありませんか?
私は警察があまりにも一般的なあなたの質問を閉じるためにラウンドされていないことに驚いています!いずれの場合でも、私はコメントでWebFormsのチュートリアルを与えることはできませんが、私はページマークアップにコントロールを追加することを検討するだろう。たとえば、テンプレートにサービスのすべてのボタンとスパンが含まれているリピーターがあるとします。次に、Repeaterを、サービスに関する関連データを含むオブジェクトのリストにバインドします。私はすべてのコントロールをテンプレートに表示し、データバインディング式を使用して可視性を設定します。例えば。開始および停止ボタンの可視性は、サービス状況によって制御されます。 – Joe
@ジョー私はタイトルが少し一般的であることを認識している、私は "私の場合"を追加することができますが、少なくともこれは事実であることが明らかです。しかし、問題自体は明らかに私のコードに集中しており、 'Page_Load'を介して' Page_Init'に配置することのメリットは何でしょうか。なぜこれがViewStateに影響を与え、どうすればそれが実際に必要なのか。 私は実際の答えでショットを撮ることをお勧めします。「コメントでWebFormsのチュートリアルを行うことはできません。私はリピーターやそのようなものにさえいなくても(それは私がWebformsにいかに新しいのか)、徹底した答えが訴えられるだろう。 – Skillzore
@Skillzone、Markusは良い答えを与えてくれました。基本的には上記のアドバイスと同じですが、よく書かれています。コントロールを動的に作成するのではなく、代わりにRepeaterを使用して、コントロールのVisibleプロパティを適切に設定して、コントロールをASPXマークアップに含めます。あなたはまだあなたがリピーターに慣れていないと言っています:もしそうなら、リバースとデータバインディングについて学ぶ前に、コントロールを動的に追加する方法を学ぶことをお勧めします。 – Joe