用户控件动态加载,参数未在asp.net中显示

时间:2016-03-23 08:53:12

标签: c# asp.net user-controls

我经常搜索这个问题,但没有提出任何问题。

我的问题如下:我有一个主视图,我想在我点击按钮时加载带参数的用户控件,但用户控件不会显示。调用用户控件的构造函数并设置参数,甚至调用来自用户控件的页面加载事件。我做错了什么?

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";
...

1 个答案:

答案 0 :(得分:1)

以下是为什么第二种按类型使用LoadControl的方法不起作用的完整说明:Asp.net Usercontrol LoadControl Issue

  

存在差异的原因是因为在第二种情况下你   绕过了两个部分类的绑定机制。

     

当您在页面中包含ascx控件作为普通声明时,   在其中声明的控件(示例中的标签)是   由类作为框架自动实例化   实例化。这是一种具有约束力的机制,可以读取&#34;前端&#34;   ascx文件并实例化类中的对象。

     

当您使用LoadControl(字符串)时 - 您的操作完全相同   事情..它使用虚拟路径来获得&#34;前端&#34;档案并确保   其中的控件是实例化的。

     

但是,当你使用new(to 2.0)LoadControl(type,object)时   版本,没有可用的虚拟路径,这是正确的,所以没有   假设(因为它无法确保类型具有前端文件)。