如何获取父项的子布局参数或Sitecore中的任何其他项

时间:2014-09-29 11:57:17

标签: c# asp.net sitecore sitecore7

我做了一些研究,但最终没有找到可能的解决方案。 以下是我能够找到的主题:

所有人都在暗示......

var sublayout = ((Sublayout)this.Parent);
NameValueCollection nvc = Sitecore.Web.WebUtil.ParseUrlParameters(sublayout.Parameters);

...是正确的,但我想要更多,因为这个方法只能给我当前的上下文子布局,即我所在的Sitecore中的当前页面。我想要能够检索子布局参数的代码一个特定的项目。例如,如果我使用Path获取Item(页面),那么如何获得其子布局参数?

PS:我正在使用Sitecore 7.0

2 个答案:

答案 0 :(得分:1)

简单的答案是您无法在页面上获取另一个子布局的子布局参数。

这是因为在向该子布局发出请求并且将参数添加到管道中的请求之前,参数不会被传递(如果我没记错的话,参数是在管道而不是上下文中传递的 - 无论如何,这将适用于两者)。

因此,获取不同子布局参数的唯一方法是: 1.如果您在父子布局中,并且正在查看您在子子布局控件上的代码中设置的参数 2.如果你经历了一些过于繁琐的代码(你可以更容易地做另一种方式)进入Sitecore,抓住在Presentation Details中添加到页面的所有Sublayout,并查看每个的参数。但请注意,此解决方案仅为您提供在Sitecore 中设置的参数。

这两种解决方案都不会为您提供在另一个子布局的代码隐藏中设置的参数。

第二种解决方案不是一个好的解决方案,因为它会变得混乱而且过于复杂。你应该做什么,如果你真的需要像这样共享参数数据,要么扩展Sitecore上下文(这可能仍然比你需要的更多工作),或使用Session来共享数据(这是对你来说可能是最好的解决方案,但要确保你不要过度使用它;就像开始使用它之前研究Session一样。

修改

如果您正在寻找有关传递请求的参数的更多信息,您需要反编译Sitecore.Kernel.DLL并手动调查。没有这方面的文档,除了可能是一个宝石或两个隐藏在博客文章的某处。

关于编写“调用请求和检索参数的函数”的评论,我高度建议不要这样做。如果我们能够完全理解您的用例,这是一个非常难看的解决方案,很容易被更好的解决方案取代。

修改2

在你的评论中,你说:

  

我有一个项目树,其中一些可能有或可能没有   拥有所需的参数(比如说一个复选框)。 A - >乙    - > C - > D,如果我在页面D,我想迭代到父节点,直到我找到复选框被选中。

根据此评论,我认为您在“字段”的位置错误地使用了“参数”一词。字段是已添加到模板的控件(例如,符号行文本字段,富文本字段,复选框字段,多列表字段等),在模板上给出标题,并且可以由用户。相反,参数是以与查询字符串相同的语法传递给子布局的键值对。参数在演示文稿详细信息中设置,而字段在项目本身(或其__Standard值或继承的__Standard值)上设置。

如果我是正确的并且您滥用“参数”这个词,那么您根本不想做您所描述的内容。您只想做以下事情:

// looking for the youngest item from the context item through its ancestors that has the "Foo" check box checked

var youngestItemWithFoo = Sitecore.Context.Item; //give the found item a name
bool foundYoungestChecked; //will be our loop condition/flag to show we found the youngest that has the box checked

// we need the root path to ensure that we do not go too far up the tree
var rootPath = Sitecore.Configuration.Factory.GetSite("website").RootPath;

// Foo is a checkbox field - the below checks raw values to see if foo is checked.
// ** Note that the way that this condition is written, the root item (often the "Home" item)
//    will still be checked but the loop will not traverse farther up the tree. You may need
//    to change this to stop the traversal sooner, depending on your solution **

while (!(foundYoungestChecked = youngestItemWithFoo["Foo"] == "1") && youngestItemWithFoo.Paths.Path != rootPath) 
{
    youngestItemWithFoo = youngestItemWithFoo.Parent; // if the Foo field is not checked, look at the parent and continue
}

//make sure that an item was found, as it is possible that none were
if (foundYoungestChecked) 
{
    //...item was found - do your stuff...
} 
else 
{
   //...item was not found - do some other stuff...
}

答案 1 :(得分:0)

我做过类似的事情,以便在过去找到父项目的渲染。它涉及围绕LayoutDefinition和RenderingDefinition类的大量代码。基本路径是获取布局定义,然后获取设备,然后获取设备的渲染。像这样:

Sitecore.Layouts.LayoutDefinition layout = Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]); 
var defaultDeviceId = "{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}";

var device = layoutDefinition.GetDevice(defaultDeviceId);
var renderingDefinitions = device.GetRenderings(renderingId);
foreach(var renderingDefinition in renderingDefinitions){
   string parameters = renderingDefinition.Parameters;
}

我假设了一个项目,并且子布局的ID(renderingId)可供您使用。另请注意,我在此处为默认设备提供了硬编码设备ID。您可能需要遍历多个设备,或者为特定设备配置配置项。请查看John West在updating layout details上的博客,了解如何访问此数据的示例。