在转发器控制中从子布局调用页面代码背后的方法

时间:2013-04-16 09:42:43

标签: c# asp.net sitecore repeater sitecore6

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

问题

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

描述

我已从此处下载了sitecore软件包 - Sitecore jQuery Content Slider ,其中提供了zip sitecore installation

转发器语法有点像这样

子布局(部分)语法

<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) %>等类似的服务器标记应解析为页面隐藏方法的值。我已尝试过我的方法,但无法使其成功。我甚至试图评论并取消注释web.config中typesThatShouldNotBeExpanded的转发器<type>System.Web.UI.WebControls.Repeater</type>

问题

  

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

2 个答案:

答案 0 :(得分:1)

Imo,数据绑定这种方式是糟糕的设计。 我会做什么(如果你这样做,你肯定会解决你的“问题”)在转发器的FindControl事件中使用ItemDataBound并将你的数据绑定到找到的控件。

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

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

答案 1 :(得分:0)

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

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

应该是

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