【问题标题】:Render Macro control on page load in umbraco template在 umbraco 模板中对页面加载进行渲染宏控制
【发布时间】:2012-08-07 11:43:57
【问题描述】:

我正在尝试加载在 umbraco 中作为单独宏存在的 razor 脚本。我正在使用 umbraco 4.7.0

我基本上是在进行地理定位,因此每次加载页面时都需要运行脚本。所以我正在寻找类似的东西:

 <script type="c#" runat="server">
protected void Page_Load(object sender, EventArgs e)
  {
    Call the Macro here
  }

显然我可以在模板中做到这一点

 <umbraco:Macro Alias="GeoTargetting" runat="server" />

但我需要在页面中加载任何控件之前调用此宏。

请帮忙。

谢谢

【问题讨论】:

  • 你能告诉我这样做的确切需要是什么。是否在宏页面加载中运行任何代码?
  • @mahesh:谢谢。基本需求是避免缓存和基于url加载宏内容。发生的情况是,如果我更改页面的 url,它会加载页面但宏被缓存,因此我无法获取宏中的确切内容。即使是回发,我在宏中也几乎没有需要调用的条件。
  • 我不确定您所说的“宏被缓存,因此我无法获取宏中的确切内容”是什么意思。如果您想在所有请求中执行操作,您可以使用 httpHandler 它将覆盖所有页面生命周期事件。所以所有的页面事件都会通过这个handler events进行路由。
  • @aneesh,你为什么不直接禁用宏缓存?

标签: asp.net razor macros umbraco pageload


【解决方案1】:

这似乎工作正常:

模板:

<umbraco:Macro Alias="Sandbox" runat="server"></umbraco:Macro>
<asp:Label runat="server" ID="Label1" Text="Yo"></asp:Label>

宏脚本:

@using System.Web.UI.WebControls
@using umbraco.MacroEngines
@inherits DynamicNodeContext
@{
    Page page = HttpContext.Current.Handler as Page;
    page.Load += new EventHandler(page_Load);
}

@functions
{
    static void page_Load(object sender, EventArgs e)
    {
        Page page = sender as Page;
        Label label = FindControlRecursive(page, "Label1") as Label;
        label.Text = "Hello";
    }

    private static Control FindControlRecursive(Control Root, string Id)
    {
        if (Root.ID == Id)
            return Root;

        foreach (Control Ctl in Root.Controls)
        {
            Control FoundCtl = FindControlRecursive(Ctl, Id);

            if (FoundCtl != null)
                return FoundCtl;
        }

        return null;
    }
}

注意:FindControlRecursive()方法来自这个forum thread

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2011-10-16
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多