2011-11-10 6 views
0

異なる状況(クエリ文字列引数、コントロールからのポストバック、ユーザー設定など)でページ/コントロールが異なるビュー(タブなど)を表示する必要があるシナリオを考えます。データベースから取得した)私は通常、マルチビューまたはプレースホルダのようなコントロールを配置し、アクティブなビューインデックスまたはこのようなVisibleプロパティを切り替えます:ASP.NET Webフォームの複数のビューと表示されないコントロールのライフサイクル

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" %> 

<%@ Register Src="SomeControl.ascx" TagName="SomeControl" TagPrefix="uc1" %> 
<!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:PlaceHolder runat="server" ID="phControl" Visible="false"> 
      <uc1:SomeControl ID="SomeControl1" runat="server" /> 
     </asp:PlaceHolder> 
     <asp:PlaceHolder runat="server" ID="phNotControl" Visible="false"> 
      Some other content 
     </asp:PlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 

そして、私のようなロジックに応じて、背後にあるコードでビューを切り替えるうこれは:

using System; 

namespace TestWebApplication 
{ 
    public partial class WebForm2 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      phControl.Visible = false; 
      phNotControl.Visible = true; 
     } 
    } 
} 
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SomeControl.ascx.cs" Inherits="TestWebApplication.SomeControl" EnableViewState="false" %> 
I am the control 

そしてコントロールの背後にあるコード:0これは制御され

using System; 

namespace TestWebApplication 
{ 
    public partial class SomeControl : System.Web.UI.UserControl 
    { 
     protected void Page_Init(object sender, EventArgs e) 
     { 
      Response.Write("I am the control's Init and I am executing heavy operations <br />"); 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      Response.Write("I am the control's Load <br />"); 
     } 

     protected void Page_PreRender(object sender, EventArgs e) 
     { 
      Response.Write("I am the control's PreRender and I am only called if the control is Visible <br />"); 
     } 
    } 
} 

しかし何問題のコントロールは、その初期化中に(データベースを呼び出して)行うには、いくつかの比較的重い仕事を持っている場合イベントをロードしますか?コントロールがVisibleでなくても実行され、ページが遅くなります。私が見る1つの可能な解決策は、表示されていないコントロールに対して実行されないため、子コントロールのPreRenderメソッドですべての作業を移動することです。ただし、ドロップダウンリストにオプションを入力するロジックが実行されないため、コントロールが動的に入力されたコントロールからユーザー入力を受け入れる場合(ドロップダウンリストを考える)、これは機能しません。

私は次の解決策を作ってみた:

  • がprerenderメソッドに重い仕事を移動した場合に、それをラップ

    (IsPostBackプロパティ!)。次に、ViewStateにドロップダウンリストの可能な値を保持させると、ASP.NETはそれを復元します。欠点は、ViewStateを使用してページのサイズを大きくしていることです。

  • コントロールをLoadControlで動的に作成し、コードの後ろのプレースホルダに追加します。これにより、キャッチアップイベントがトリガーされ、ドロップダウンに挿入されるコードは、それが属するInitメソッドに置くことができます。欠点は、レイアウトがコードの背後に定義されていることです。マークアップを見ると、ページ上にどのようなコントロールがあるのか​​わかりませんし、その背後にあるコードを見ると、コントロールがどこに表示されるのかがはっきりしません。また、スタイリングやその他の「デザイン」操作が難しくなります。

  • それはそのままです。欠点は、追加のデータベースクエリが存在することであり、多くのビューがある場合は、これらが加算されます。

私の実際の質問は、ViewStateに物を入れずに、複数のクエリを使わずに、レイアウトをコードの背後にドラッグすることなくこの問題を解決する方法です。

答えて

1

重いデータベース作業のためにAJAXコールを作成する方法はありますか?

次に、ビューを表示し、必要なデータをバックグラウンドで読み込んで表示することができます。ページが本当に速く読み込まれ、現在データがロードされているという表示が表示される可能性があります。

+0

はい、これは私が探していた答えではありませんでした。まず、これは、JSでコントロールを作成する点を除いて、C#でコントロールを動的に作成することと等価です。それでも、ASP.NETマークアップ内のフローをはっきりと見ることはできません。次に何らかの理由でAJAXでやりたくない場合(たとえばSEOやモバイルビューなど) ありがとうございます。 – Stilgar

0

InitControl()などのユーザーコントロールでパブリックメソッドを作成する方法について説明します。代わりにInitControl()内のすべての重い作業をページの読み込みで行います。次に、親ページで、ページが表示されているときにInitControlを呼び出します。

using System; 

namespace TestWebApplication 
{ 
    public partial class WebForm2 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      phControl.Visible = false; 
      phNotControl.Visible = true; 
      SomeControl1.InitControl(); 
     } 
    } 
} 

ユーザーコントロールのOnLoadイベント内で作業をしないでください。

関連する問題