2017-07-12 18 views
2

私は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でどのようにアクセスできますか? UpdatePanelHtmlButtonのプライベートグローバルリストはとても汚れているように感じます。

私はViewStateがPage_InitとPage_Loadの間に読み込むことを知っていますが、それは実際にはどういう意味ですか?私は完全なポストバックを行いませんが、代わりにRegisterAsyncPostBackControlを使用してUpdatePanelのポストバックを更新するだけなので、Page_Loadで再設定する必要はありませんか?

+0

私は警察があまりにも一般的なあなたの質問を閉じるためにラウンドされていないことに驚いています!いずれの場合でも、私はコメントでWebFormsのチュートリアルを与えることはできませんが、私はページマークアップにコントロールを追加することを検討するだろう。たとえば、テンプレートにサービスのすべてのボタンとスパンが含まれているリピーターがあるとします。次に、Repeaterを、サービスに関する関連データを含むオブジェクトのリストにバインドします。私はすべてのコントロールをテンプレートに表示し、データバインディング式を使用して可視性を設定します。例えば。開始および停止ボタンの可視性は、サービス状況によって制御されます。 – Joe

+0

@ジョー私はタイトルが少し一般的であることを認識している、私は "私の場合"を追加することができますが、少なくともこれは事実であることが明らかです。しかし、問題自体は明らかに私のコードに集中しており、 'Page_Load'を介して' Page_Init'に配置することのメリットは何でしょうか。なぜこれがViewStateに影響を与え、どうすればそれが実際に必要なのか。 私は実際の答えでショットを撮ることをお勧めします。「コメントでWebFormsのチュートリアルを行うことはできません。私はリピーターやそのようなものにさえいなくても(それは私がWebformsにいかに新しいのか)、徹底した答えが訴えられるだろう。 – Skillzore

+0

@Skillzone、Markusは良い答えを与えてくれました。基本的には上記のアドバイスと同じですが、よく書かれています。コントロールを動的に作成するのではなく、代わりにRepeaterを使用して、コントロールのVisibleプロパティを適切に設定して、コントロールをASPXマークアップに含めます。あなたはまだあなたがリピーターに慣れていないと言っています:もしそうなら、リバースとデータバインディングについて学ぶ前に、コントロールを動的に追加する方法を学ぶことをお勧めします。 – Joe

答えて

2

ViewStateが必要ない場合は、Page_Loadでコントロールを作成することもできます。 ViewStateは、コントロールの値(コントロールに依存する)を格納し、PostBackをサーバーに送信するときに使用するために使用されます。

たとえば、テキストボックスがある場合、PostBackには新しいテキストボックスの値とViewStateの古い値が含まれます。 ASP.NETフレームワークは、これらの2つを比較し、必要に応じてTextChangedイベントを発生させます。 ViewStateがなければ、これは不可能です。

ASP.NET Webフォームで動的に作成されたコントロールに関するアドバイスは、その使用を避けることです。それらは複雑さを非常に速くし、通常は必要ではありません(たとえ最初にそうであっても)。

ほとんどの場合、はるかに簡単なアプローチがあります。リピータを使ってあなたの場合、あなたはサービスのリストを持っています。このリストをRepeaterにバインドすることで、コントロールを手動で作成しないようにすることができます。リピーターの使い方はこちらlinkを参照してください。

リピータを使用するもう1つの利点は、コードビハインドファイルではなく、ASPXマークアップでUIを定義できることです。あなたの例では、サービスのステータスに基づいてUIを変更します。この場合、RepeaterのItemDataBoundイベントを使用するとよいでしょう。

+0

リピータのアプローチがよりうまくなります。私はまだそれらに精通していない、今それらを読んで。私は 'Page_Init'は無関係になると思っていますか?コントロールはASPXマークアップとRepeaterで作成されるので、データバインディングは 'Page_Load'で行うべきです、もし私が間違っていないのであれば? – Skillzore

+0

@Skillzoreでは、リピータのアプローチが最後にはるかに簡単であることがわかります。 'Page_Init'とすべてのコントロール作成の必要はもうありません。通常、Repeaterの 'DataSource'を' Page_Load'に設定します。データ自体に基づいてレイアウトを変更したい場合(サンプル内にはサービスのステータスに基づいてif文があります)、 'ItemDataBound'を使用する必要があります。私は小規模にすることを提案し、サービス名を出力するRepeaterを作成し、共通サービスレイアウトをテンプレートに追加し、最後に 'ItemDataBound'を追加します。 – Markus

+0

ええ、私はそれについて読んで物事を試し始める。ちょうど私がデータ結合を間違っていないことを確認したかったのです。今のところうまく働いているようだ。ありがとうございました! ボタンやボタンイベントの仕組みがわからないのですが、私はhttps://stackoverflow.com/q/45055878/6320872を持っている別の質問にあなたの意見をお寄せいただきありがとうございます。再度、感謝します! – Skillzore

関連する問題