2016-03-23 17 views
1

この問題は多く検索しましたが、何も表示されませんでした。asp.netにパラメータが表示されない状態でユーザーコントロールが動的に読み込まれる

私の問題は次のとおりです。ボタンをクリックしてもユーザーコントロールを表示しないで、パラメータを持つユーザーコントロールをロードするメインビューがあります。ユーザーコントロールのページロードイベントが呼び出された場合でも、ユーザーコントロールのコンストラクターが呼び出され、パラメーターが設定されます。何が間違っているのですか?

Main.aspx

<%@ Page Title="Main page" Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" Inherits="MainApp.Main" MasterPageFile="~/Site.master" %> 
    <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"></asp:Content> 

    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <%-- some other fields which i send to the user control on click --%> 
       <div class="col-lg-1 col-sm-12 col-md-1"> 
        <asp:Button runat="server" CssClass="btn btn-primary" CausesValidation="false" ID="generateData" OnClick="generateData_Click" Text="View info" /> 
       </div> 
    <div runat="server" id="contentDiv"> 
     <p>No info available atm.</p> 
    </div> 
</asp:Content> 

Main.aspx.csボタンクリックイベント:

protected void generateData_Click(object sender, EventArgs e) 
{ 
    UserControl1 uc = (UserControl1)this.LoadControl(typeof(UserControl1), new object[] { param1, param2, param3}); 
    contentDiv.Controls.Clear(); 
    contentDiv.Controls.Add(uc); 
} 

UserControl1.aspx.cs

public partial class UserControl1: System.Web.UI.UserControl 
{ 
     public string Param3 { get; set; } 
     public string Param1 { get; set; } 
     public string Param2 { get; set; } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      Page.DataBind(); 
     } 

     public UserControl1(string param1, string param2, string param3) 
     { 
      Param1 = param1; 
      Param2 = param2; 
      Param3 = param3; 
     } 
} 

UserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl1.ascx.cs" Inherits="MainApp.UserControls.UserControl1" %> 
<div> 
    <p style="color: red">Under construction</p> 
</div> 

ユーザーコントロールはメインページには表示されません。その理由はわかりません。

PS:私は以下のようにパラメータを送信できることを知っていますが、私は上記の方法を使用できない理由を理解できません。ここで

UserControl1 uc = (UserControl1)this.LoadControl("~/UserControls/UserControl1.ascx"); 
uc.Param1 = "val1"; 
... 
+0

それは働いて@BikashSinghMaharjan [この](http://geekswithblogs.net/shahed/archive/2006/03/23/73096.aspx) – Bikee

+0

を見てみましょうが、なぜ代わりに、いくつかの余分な方法を使用してください組み込み機能ですか? – Zippy

答えて

1

は、タイプ別にLoadControlを持つ第2の方法は動作しません理由の完全な説明である:Asp.net Usercontrol LoadControl Issue

第2のインスタンスでは、 が2つの部分クラスのバインディングメカニズムをバイパスしているため、違いがある理由があります。クラスは をインスタンス化されるように、通常の宣言、その中で宣言さ コントロール(あなたの例では、ラベルが) 自動的にフレームワークによってインスタンス化されると、ページにASCXコントロールが含ま

。これは、 "フロントエンド"の ascxファイルを読み取り、クラス内のオブジェクトをインスタンス化する拘束力のある方法です。

LoadControl(文字列)を使用すると、まったく同じ ものを実行しています。仮想パスを使用して "フロントエンド"ファイルを取得し、 コントロールがインスタンス化されていることを確認します。

新しい(2.0)LoadControl(タイプ、オブジェクト) バージョンを使用する場合ただし、利用可能な仮想パスが存在しない、それはタイプがフロントエンドを持っていることを確認することができないとして、それは当然のように何も 仮定を(行うものではありませんファイル)。

+0

説明をありがとう。それは、Microsoftが期待どおりに使用することができない方法を追加したことは奇妙に思えます。 – Zippy

関連する問題