Sitecore Sublayout中字符串中的正斜杠丢失

时间:2015-04-27 12:20:58

标签: c# html sitecore

我在Sitecore子布局后面的C#代码中有一个函数,它返回一个如下所示的字符串:

public string getProductTitle() 
    {
        Item productItem = itemHelper.GetItemByPath(currentItemPath);
        Sitecore.Data.Fields.ImageField imgField = ((Sitecore.Data.Fields.ImageField)productItem.Fields["Logo"]);
        if (imgField.Value != "")
        {
            return "<sc:Image CssClass=\"product-image ng-scope\" Field=\"Logo\" runat=\"server\" />";
        }

        string productTitle = "";
        productTitle = productItem["Produkt Titel"];
        return "<div class=\"product-name ng-binding ng-scopen\" ng-if=\"!currentProduct.imageNameHome\">" + productTitle + "</div>";
    }

在ascx中,我称之为功能:

<%= getProductTitle() %>

问题是最终这是我在运行时使用HTML获得的内容:

"<sc:Image CssClass=\"product-image ng-scope\" Field=\"Logo\" runat=\"server\" >";

结尾处的/缺失,这会打破整行并且不会显示任何图像。

我也试过这个:

string a = WebUtility.HtmlEncode("<sc:Image CssClass=\"product-image ng-scopen\" Field=\"Logo\" runat=\"server\" />");
return WebUtility.HtmlDecode(a);

和此:

return @"<sc:Image CssClass=""product-image ng-scopen"" Field=""Logo"" runat=""server"" />";

结果相同。

我在这里遗漏了什么吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于ASP.NET页面生命周期,我看不到这个工作。

Sitecore控件就像普通用户控件一样,它们在服务器端运行 - 将它们作为字符串返回在页面生命周期中为时太晚,无法呈现它们。

我会将<sc:Image />控件放在ascx页面中或使用FieldRenderer对象从Sitecore获取HTML

 Sitecore.Web.UI.WebControls.FieldRenderer.Render(myItem, "MyFieldName", "disable-web-editing=true");

然后,您可以使用逻辑根据您的要求显示或隐藏图像字段和标题控件。这假设您使用的是Sitecore上下文项。

<%= getProductTitle() %>替换为

 <sc:Image runat="server" ID="imgLogo" Field="Logo" />

 <asp:Placeholder runat="server" ID="phTitle">
   <div class=\"product-name ng-binding ng-scopen\" ng-if=\"!currentProduct.imageNameHome><sc:Text runat="server" ID="title"  Field="Produkt Titel"/></div>
 </asp:Placeholder>

然后在页面加载方法

背后的代码中
 var currentItem = Sitecore.Context.Item;
 if(string.IsNullOrEmpty(currentItem["Logo"])
 {
    imgLogo.Visible=False;
 }

 if(string.IsNullOrEmpty(currentItem["Produkt Titel"])
 {
     phTitle.Visible=False;
 }

此处提供更多信息:

http://gettingtoknowsitecore.blogspot.co.uk/2010/01/displaying-field-values-using-server.html

答案 1 :(得分:1)

由于您有两种您希望提供信息的替代方法,我会考虑将控件和HTML移动到您的标记文件(ASCX),然后将这些段包装在asp:占位符控件中。

<asp:placeholder id="imageTitle" runat="server" Visible="false">
    <sc:Image CssClass="product-image ng-scope" Field="Logo" runat="server" />
</asp:placeholder>
<asp:placeholder id="textTitle" runat="server>
    <div class="product-name ng-binding ng-scopen" ng-if="!currentProduct.imageNameHome">
       <asp:Literal id="productTitleLiteral" runat="server" />
    </div>;
</asp:placeholder>

然后,您可以在页面加载期间切换代码中占位符的可见性。

public void Page_Load{
   Item productItem = itemHelper.GetItemByPath(currentItemPath);
   Sitecore.Data.Fields.ImageField imgField = ((Sitecore.Data.Fields.ImageField)productItem.Fields["Logo"]);
    if (imgField.Value != "")
    {
        this.imageTitle.Visible = true;
        this.textTitle.Visible = false;
    }
    else {
        this.imageTitle.Visible = false;
        this.textTitle.Visible = true;
        this.productTitleLiteral.Text = productItem["Produkt Titel"];
    }
}

这将允许您确保正确封装业务逻辑与表示标记,并且可以更好地使用.NET生命周期。