当Composite C1在Content透视图中显示网站和页面树时,它使用页面Title属性作为节点标签。这并不总是很舒服,尤其是当页面被翻译成不同的文化时,您甚至无法阅读这些标题并快速找到您要查找的页面。 我们的想法是使用UrlTitle作为标签,因此每个树节点都代表页面URL的一部分。 请参阅下面的解决方案。
答案 0 :(得分:0)
我不想重新编译程序集,所以我的hack很丑,但只影响javascript和aspx。
修改 /Composite/scripts/compressed/top.js 。
找到SystemTreeNodeBinding.prototype.onBindingAttach=function(){
并在此函数的开头注入以下代码:
if(window.treeNodeProcessor)window.treeNodeProcessor(this.node);
现在您可以在显示树节点之前修改它;您只需要创建全局函数treeNodeProcessor
。
编辑 /Composite/top.aspx (top.aspx.cs也会受到影响,因此将它们保存在一起)。
在head
元素的末尾添加您的javascript:
<script type="text/javascript">
function byKey(key) {
return function(p) {
return p.Key == key;
}
}
window.treeNodeTitles = {
<% WriteTreeNodeTitles(); %>
"": ""
};
window.treeNodeProcessor = function(node) {
if(node._data.PropertyBag) {
var uri = node._data.PropertyBag.find(byKey('Uri')).Value;
node._data.Label = window.treeNodeTitles[uri] || node._data.Label;
}
}
</script>
不幸的是,传递给node
的{{1}}对象中没有UrlTitle。但是,每个页面treeNodeProcessor
都有node
,用于在 Uri 〜/ page(a9d30645-02f7-4412-bd4e-6f3a02782481)之类的值>。所以,你必须自己查询UrlTitle,在WriteTreeNodeTitles方法中做了什么(见下文)。
修改 /Composite/top.aspx.cs 。
添加新方法:
PropertyBag
当然,您必须添加一些用法:
protected void WriteTreeNodeTitles()
{
using (var conn = new DataConnection())
{
foreach( string line in conn.Get<IPage>().Select( p => " \"~/page(" + p.Id.ToString().ToLower() + ")\": \"" + p.UrlTitle + "\",\r\n" ) )
{
Response.Write( line );
}
}
}
所以,现在你的top.aspx包含了类似于页面guid的url到UrlTitles的映射,以及使用该映射来修改页面树的treeNodeProcessor函数。