【问题标题】:How to get sublayout parameters of a parent item or any other Items in Sitecore如何在 Sitecore 中获取父项或任何其他项的子布局参数
【发布时间】:2014-09-29 11:57:17
【问题描述】:

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

所有人都在暗示这...

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

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

PS:我使用的是 Sitecore 7.0

【问题讨论】:

  • 子布局渲染参数只能为子布局实例配置。您不能为树中的项目设置它们。您能否更准确地描述您想要实现的目标?
  • 我有一个项目树,其中一些可能有或可能没有所需的参数(例如,一个复选框)。 A -> B -> C -> D ,如果我在页面 D,我想迭代到父节点,直到我找到复选框被选中...
  • 所以你不想检查子布局的渲染参数。你想找到第一个设置了字段的祖先吗?

标签: c# asp.net sitecore sitecore7


【解决方案1】:

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

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

因此,获取不同子布局参数的唯一方法是: 1. 如果您在父子布局中并且正在查看子子布局控件上的参数您在代码中自己设置的 2. 如果您通过一些过于繁琐的代码(您可以通过其他方式更轻松地执行某些操作)进入 Sitecore,请在 Presentation Details 中获取添加到页面的所有子布局,并查看每个子布局的参数。但是请注意,此解决方案只为您提供在 Sitecore 中设置的参数

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

第二种解决方案不是一个好的解决方案,因为它会很混乱且过于复杂。如果您真的需要像这样共享参数数据,您应该做的是扩展 Sitecore 上下文(这可能比您正在做的工作更多),或者使用 Session 共享数据(这是可能是最适合您的解决方案,但请确保您不要过度使用它;与任何事情一样,在开始使用之前研究Session)。

编辑

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

关于您关于编写“调用请求和检索参数的函数”的评论,我会强烈建议不要这样做。这是一个非常丑陋的解决方案,如果我们完全了解您的用例,很容易被更好的解决方案所取代。

编辑 2

在你的评论中,你说:

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

从这个评论中,我相信你错误地使用了“参数”这个词来代替“字段”。 Field 是添加到模板中的控件(如Signle-Line Text field、Rich-Text Field、Checkbox Field、Multilist Field等),在模板上给定一个标题,可以通过一个用户。相反,参数是传递给子布局的键值对,其语法与查询字符串相同。参数设置在演示详细信息中,而字段设置在项目本身(或其 __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...
}

【讨论】:

  • 您好 Zachary,我在哪里可以获得有关在请求中传递的参数的更多信息?我发现当我们只能获取当前的子布局参数而不能获取父级的子布局参数时,这是没有意义的。无论如何,如果您说的是真的,那么我可以尝试编写一个函数来调用请求并检索参数吗???
  • 请查看我的问题下的编辑。我不需要共享数据。
  • 是的,你可以这样做 - 但我强烈建议不要这样做。您无法检索父子布局的渲染参数这一事实实际上非常有意义,因为它纯粹是基于请求的,并且参数实际上是用于与实际呈现相关的子布局特定设置,甚至与项目本身无关。是的,您可以将它们用于其他用途,但这就是字段的用途。如果您正在寻找更多信息,请参阅我的编辑。
【解决方案2】:

我过去曾做过类似的事情来查找父项的渲染。它涉及大量围绕 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 上的博客,了解如何访问这些数据的示例。

【讨论】:

  • 如何获取 DeviceId 或知道我使用的是哪种设备?它是否根据用户设备交替出现?这个设备对我来说有点新
  • 好的,我试过你的方法,但是当我调用字符串参数 = renderingDefinition.Parameters;它只返回给我参数名称和默认值。不是我为我的项目配置的值 :'(
  • 嗨@Nexus,您正在使用的设备可以通过 Sitecore.Context.Device 检索,或者如果您想指定特定设备,您可以在 Sitecore 中找到它们并找到项目 ID 或路径你想加载。至于参数,我很抱歉它没有加载作者指定的值。解决此问题的一种方法是将子布局更改为使用数据源并使用 renderingDefinition.Datasource 获取数据。
  • @JayS - 查看 Nexus 对其帖子的第二条评论。我认为他根本不是在寻找参数。我认为他在他的 OP 中将“参数”一词与“字段”一词混淆了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多