0

我正在尝试从子布局中实际的转发器控件调用页面的代码隐藏方法。

问题

sc:fieldrenderer效果很好并在页面源上呈现,但似乎<%# method(data) %>无法正常工作并按页面源上的方式打印。

描述

我已经从这里下载了 sitecore 包 - Sitecore jQuery Content Slider,它提供了zip sitecore 安装

而中继器语法有点像这样

子布局(部分)语法

<asp:repeater runat="server" id="repeater">
<itemtemplate>
    <li>
        <div style="background: url("
            <%# GetImageUrl(Container.DataItem) %>); height:
            <%# Height %>px;">

            <div style="padding:"
                <%# GetTopMargin(Container.DataItem) %>px 0px 0px
                <%# GetLeftMargin(Container.DataItem) %>px; width:
                <# GetTextWidth(Container.DataItem) %>px; text-align:
                <%# GetTextAlignment(Container.DataItem) %>;">
                <div class="title">
                    <sc:fieldrenderer fieldname="Title" item=''
                        <%# Container.DataItem %>' runat="server"></sc:fieldrenderer>
                </div>

                <div class="text">
                    <sc:fieldrenderer fieldname="Text" item=''
                        <%# Container.DataItem %>' runat="server"></sc:fieldrenderer>
                </div>

                <div class="link">
                    <sc:fieldrenderer fieldname="URL" item=''
                        <%# Container.DataItem %>' runat="server"></sc:fieldrenderer>
                </div>
            </div>

        </div>
    </li>
</itemtemplate>
</asp:repeater>

子布局代码后面

    public string GetImageUrl(object itm)
    {
        Item item = (Item)itm;
        ImageField image = item.Fields["Image"];

        if (image != null)
        {
            MediaItem i = image.MediaItem;

            if (i == null)
            {
                return string.Empty;    
            }

            string u = Sitecore.Resources.Media.MediaManager.GetMediaUrl(i);

            u = HttpUtility.UrlPathEncode(u);

            return string.Concat("", u);
        }

        return string.Empty;
    }

输出

<div style="background: url(<%# GetImageUrl(Container.DataItem) %>); height:<%# Height %>px;">

<div style="padding:"<%# GetTopMargin(Container.DataItem) %>px 0px 0px <%# GetLeftMargin(Container.DataItem) %>px; width: <# GetTextWidth(Container.DataItem) %>px; text-align:<%# GetTextAlignment(Container.DataItem) %>;">
    <div class="title">
        Untitled Item
    </div>

    <div class="text">
        Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum
    </div>

    <div class="link">
        <a title="Lorem-Ipsum">Learn about Lorem Ipsum</a>
    </div>
</div>

</div>

预期产出

诸如此类的服务器标记<%# GetImageUrl(Container.DataItem) %>应解析为来自 page behind 方法的值。我已经尝试了我的方法,但无法使这个可行..我什至尝试typesThatShouldNotBeExpanded在 web.config 中为转发器评论和取消评论<type>System.Web.UI.WebControls.Repeater</type>

问题

如何解决这里的问题,或者我应该更改为转发器ItemDataBound事件等等?

4

2 回答 2

1

Imo,以这种方式进行数据绑定是糟糕的设计。我会做的(如果你这样做,你肯定会解决你的“问题”)是FindControlItemDataBound转发器的情况下使用并将你的数据绑定到找到的控件。

asp:Panel您可以使用控件并在其上设置属性,而不是 DIV 元素Style(尽管我强烈建议您使用 CSS 类来保持它的可维护性)

如果有人可以格式化此答案,将不胜感激(使用移动设备)

于 2013-04-16T09:54:28.087 回答
0

我知道这已经被回答和接受,但你也有一个错字:

<# GetTextWidth(Container.DataItem) %>px; text-align:

应该

<%# GetTextWidth(Container.DataItem) %>px; text-align:
于 2013-04-16T12:48:48.360 回答