我有一个XSLT宏,它在循环中呈现一些标记和.NET用户控制宏。这就是xslt宏中的多个usercontrol宏:
<xsl:for-each select="$node/* [@isDoc]">
//Some markup etc...
<xsl:value-of select="umbraco.library:RenderMacroContent('<?UMBRACO_MACRO NodeId="@id" macroAlias="LogTag"></?UMBRACO_MACRO>', @id)" disable-output-escaping="yes"/>
</xsl:for-each>
来自usercontrols标记的标记很好,但Page_load
中的所有内容都没有执行。这是为什么?
继承用户控制标记:
<div class="logTag" id="Tag" runat="server">
<img src="someimage.png" alt="image"/>
</div>
代码隐藏:
public int NodeId { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)return;
var tools = new Tools();
var userId = (Int32)Membership.GetUser().ProviderUserKey;
Tag.Visible = tools.GetLog(NodeId, userId);
Response.Write("Node=" + NodeId + " - User=" + userId + "<br />");
}
Response.Write或Tag.Visible都不起作用。我已经尝试直接在空白上测试usercontrol宏 - 工作正常!这是不可能的,还是我做错了什么?
答案 0 :(得分:2)
不幸的是,由于XSLT宏的性质以及在页面生命周期中调用render事件的位置意味着library.RenderMacroContent()方法在XSLT中不起作用。
在Hendy Racher's blog上讨论了一种解决方法,用于创建“小部件”功能,如果这是您所追求的。这利用了一个ASP.NET转发器,它在页面周期的正确阶段注入用户控件,以允许用户控制宏工作。否则,请使用Umbraco 4.7及更高版本中的Macro Container数据类型,这允许在Umbraco后台内部执行宏的拖放功能,并且可以使用<umbraco:Item />
标记成功呈现(usercontrols,Razor或XSLT)。