這種情況是我有很多FieldRenderers。這些應該輸出來自各個地方的數據,一些來自項目X,另一些來自項目Y.並且應該輸出來自項目Z的屬性。什麼是設置FieldRenderer的Item或DataSource屬性的好方法?
假設我有一個公共屬性ItemX
,我想輸出一個屬性,任何以下是可以的。但我任何人得不到任何輸出:
<sc:FieldRenderer runat="server" FieldName="Logo" DataSource="<%# ItemX %>" />
<sc:FieldRenderer runat="server" FieldName="Logo" DataSource="<%= ItemX.Paths.FullPath %>" />
<sc:FieldRenderer runat="server" FieldName="Logo" Item="<%# ItemX %>" />
<sc:FieldRenderer runat="server" FieldName="Logo" Item-ID="<%# ItemX.ID %>" />
<sc:FieldRenderer runat="server" FieldName="Logo" Item-ID-Guid="<%# ItemX.ID.Guid %>" />
如果我添加一個ID MyFieldRenderer
給它做下面的難看的片片,我得到正確的輸出:
MyFieldRenderer.Item = ItemX;
必須有一個更好的辦法去做這個?我不確定這是一個Sitecore特定還是WebForms問題。
您的建議1,2和5沒有真正解決問題的方法,因爲它們會導致等量的每個數據源項複製代碼作爲我最初的問題(你的建議#1)。爲了記錄,我認爲建議#2是可怕的:)#4不是可擴展的,並且在所有地方重複路徑。 #3需要交換所有現有的FieldRenderers(這是一個大型項目中風險較大的「全部替換」操作),但實際上是一個有效的建議。 – Simeon
哎唷!我有點喜歡#2;)但我同意,如果項目數量超過一個或兩個,它不可擴展。 (我正在尋找一些能夠讓你在ASCX中保留所有更改的東西。)我已經在ExpressionBuilders上添加了一個部分,這將允許您保留路徑合併。你提出的解決方案看起來很合理,但我會傾向於#3,並引用一個StringToPath引用類。 –
這很有創意,我會給你的!但在我最近的項目中,我們有40多個可推薦的「關鍵項目」結構。感謝最後的解決方案#6,這很有趣,因爲在控件上調用'.DataBind()'使得它們輸出ViewState數據。構建一個ExpressionBuilder類,您可以直接從標記中引用項目ID,避免額外的數據。它唯一的限制是頁面需要被編譯(使用'CodeBehind'而不是'CodeFile'),但我想大多數項目都會編譯它們的頁面/控件。我會根據這個建議寫一個完整的答案! – Simeon