我经常搜索这个问题,但没有提出任何问题。
我的问题如下:我有一个主视图,我想在我点击按钮时加载带参数的用户控件,但用户控件不会显示。调用用户控件的构造函数并设置参数,甚至调用来自用户控件的页面加载事件。我做错了什么?
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 :(得分:1)
以下是为什么第二种按类型使用LoadControl的方法不起作用的完整说明:Asp.net Usercontrol LoadControl Issue。
存在差异的原因是因为在第二种情况下你 绕过了两个部分类的绑定机制。
当您在页面中包含ascx控件作为普通声明时, 在其中声明的控件(示例中的标签)是 由类作为框架自动实例化 实例化。这是一种具有约束力的机制,可以读取&#34;前端&#34; ascx文件并实例化类中的对象。
当您使用LoadControl(字符串)时 - 您的操作完全相同 事情..它使用虚拟路径来获得&#34;前端&#34;档案并确保 其中的控件是实例化的。
但是,当你使用new(to 2.0)LoadControl(type,object)时 版本,没有可用的虚拟路径,这是正确的,所以没有 假设(因为它无法确保类型具有前端文件)。