2015-04-27 35 views
3

我有一個Sitecore的sublayout返回一個字符串,它看起來像這樣的背後的C#代碼的函數:斜槓在Sitecore的從字符串中缺少Sublayout

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"" />"; 

具有相同的結果。

我在這裏錯過了什麼嗎?我怎樣才能解決這個問題?

回答

1

既然你有兩種可選方式,你希望提供您的信息我會考慮將您的控件和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生命週期。

+0

我得到這個工作要感謝你們倆。但是現在我遇到了另一個相關的問題:我將如何在中繼器中使用它?在後面的代碼中,我得到了錯誤消息** this.imageRelatedTitle.Visible = true; **沒有定義imageRelatedTitle。我有一箇中繼器中帶有此Id的asp:placeholder。 – SpaceJump

+0

只是計算出來:_var imageRelatedTitle = e.Item.FindControl(「imageRelatedTitle」)作爲PlaceHolder; _在ItemDataBound函數中。 – SpaceJump

+0

很高興它正在制定@SpaceJump! –

2

由於ASP.NET頁面的生命週期,我看不到這個工作。

Sitecore控件就像普通的用戶控件一樣,它們在服務器端運行 - 將它們作爲字符串返回將在頁面生命週期中爲它們渲染太晚。

我會放置在ASCX頁<sc:Image />控制或使用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