Sitecore 子布局中的字符串中缺少正斜杠
Forward-Slash missing from string in Sitecore Sublayout
我在 Sitecore 子布局后面的 C# 代码中有一个函数,returns 一个看起来像这样的字符串:
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"" />";
结果相同
我是不是漏掉了什么?我该如何解决这个问题?
由于 ASP.NET 页面生命周期,我看不到这个工作。
Sitecore 控件就像普通的用户控件,它们 运行 在服务器端 - 以字符串形式返回它们在页面生命周期中为时已晚,无法呈现。
我会将 <sc:Image />
控件放在 ascx 页面中或使用 FieldRenderer
object 从 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
由于您希望通过两种替代方式来呈现您的信息,我会考虑将您的控件和 HTML 移动到您的标记文件 (ASCX),然后将这些段包装在 asp:placeholder 控件中。
<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 生命周期一起工作。
我在 Sitecore 子布局后面的 C# 代码中有一个函数,returns 一个看起来像这样的字符串:
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"" />";
结果相同
我是不是漏掉了什么?我该如何解决这个问题?
由于 ASP.NET 页面生命周期,我看不到这个工作。
Sitecore 控件就像普通的用户控件,它们 运行 在服务器端 - 以字符串形式返回它们在页面生命周期中为时已晚,无法呈现。
我会将 <sc:Image />
控件放在 ascx 页面中或使用 FieldRenderer
object 从 Sitecore
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
由于您希望通过两种替代方式来呈现您的信息,我会考虑将您的控件和 HTML 移动到您的标记文件 (ASCX),然后将这些段包装在 asp:placeholder 控件中。
<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 生命周期一起工作。