是否可以将Web用户控件注入另一个Web用户控件?

时间:2011-06-29 09:49:04

标签: c# .net asp.net frameworks

我的网络应用程序(.NET Framework 3.5C#)上有一个Web用户控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Home.ascx.cs" Inherits="context_centro_Home" %>

<div class="main">
    Hello page
</div>

<%=strBuild %>

现在,字符strBuild的内容不是由Home.ascx.cs生成的,而是来自Testo.ascx.cs;所以我想我需要将Testo's Web User Control注入Home

有可能吗?我该怎么办?

4 个答案:

答案 0 :(得分:2)

上下文将始终是当前页面的上下文,并且为了使用在另一个页面和/或用户控件中定义的变量,您需要将其存储在Session中或作为QueryString参数传递(或类似的方法)存储/检索数据)。

答案 1 :(得分:2)

您可以将用户控件放在另一个用户控件中,方法与将用户控件放在页面中的方式相同,即在标记中。你不需要“注入”任何东西。

答案 2 :(得分:2)

是的,这是可能的,但有一些副作用。

    // load the control
    var oTesto = Page.LoadControl("Testo.ascx");

    // here you need to run some initialization of your control
    //  because the page_load is not loading now.

    // a string writer to write on it
    using(TextWriter stringWriter = new StringWriter())
    {
      // a html writer
      using(HtmlTextWriter GrapseMesaMou = new HtmlTextWriter(stringWriter))
      {
        // now render the control inside the htm writer
        oTesto.RenderControl(GrapseMesaMou);

        // here is your control rendered output.
        strBuild = stringWriter.ToString();
      }
    }

其他可能的方法是在那里放置一个占位符,然后在加载控件后,将它添加到占位符中,但由于你的问题中有一个字符串,我会这样输入。

答案 3 :(得分:1)

这很丑陋,但应该有效:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Home.ascx.cs" Inherits="context_centro_Home" %>
<uc1:Testo id="Testo1" runat="Server" Visible="false" />
<div class="main">
    Hello page
</div>
<%=Testo1.strBuild %>

建议一个相当丑陋的解决方案,我会进一步说你可能想考虑在这里改变你的架构 - 因为我不是100%清楚opn你想要实现什么我不太清楚建议什么!但是,在一天结束时,strBuild变量的内容可能应填充在第三个用户控件中,然后在Testo和Home用户控件中使用。 e.g:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Home.ascx.cs" Inherits="context_centro_Home" %>

<div class="main">
    Hello page
</div>
<uc1:strBuild id="strBuild1" runat="Server" />

其中strBuild控件如下所示:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="strBuild.ascx.cs" Inherits="context_centro_strBuild" %>
<%=strBuild %>

有意义吗?

无论如何,希望有所帮助, 戴夫