【问题标题】:Echoing sitecore item name in an ASPX layout在 ASPX 布局中回显站点核心项目名称
【发布时间】:2011-09-07 16:53:02
【问题描述】:

我确信这是一个非常简单的 Sitecore 问题,但是我对 ASP.NET 一点也不熟悉,如果能提供任何帮助,我将不胜感激。下面是 LayoutMain.aspx 文件的 sn-p 文件,不出所料,它是我运行的网站大部分页面的主要布局文件。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LayoutMain.aspx.cs" Inherits="Company.Website.Layouts.LayoutMain" %>
<%@ Import Namespace="Company.Business"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <!-- LayoutMain -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <title><sc:FieldRenderer FieldName="item" runat="server" /></title>

我想在&lt;html&gt; 标记中添加一个ID 和几个类属性。这将通过整个网站的 CSS 为我提供细粒度的样式控制,而不必在 .aspx 文件中乱七八糟!

我希望 ID 属性取自 Sitecore\Home 的第一个子级别,并且 class 属性包含当前项目名称和当前项目模板项目名称。这将导致如下结果:

<html xmlns="http://www.w3.org/1999/xhtml" id="shop" class="big-boxes product">

当前项目在主 CMS 树中为 Sitecore\Home\shop\boxes\big-boxes,并且模板为 product

非常感谢。

【问题讨论】:

    标签: asp.net css layout sitecore


    【解决方案1】:

    我认为你可以简单地用这行来做到这一点:

    <html xmlns="http://www.w3.org/1999/xhtml" id="shop" class='<%# Sitecore.Context.Item.Name + Sitecore.Context.Item.Template.Name %>'>
    

    希望对你有帮助。

    编辑:

    记得在Page_Load 方法中添加Databind(); 以获取数据绑定。

    您可以使用相同的原理来使 id 动态化。

    【讨论】:

    • 非常感谢您的回复,不幸的是,这只会导致:&lt;html xmlns="http://www.w3.org/1999/xhtml" id="shop" class=''&gt; 我也希望 id 属性也是动态的 - 这可能吗?
    • 使用&lt;%= 而不是&lt;%#,否则你需要Page.DataBind()。要获取 ID,只需按照 Holger 给您的示例...&lt;html class='&lt;%# Sitecore.Context.Item.Name + Sitecore.Context.Item.Template.Name %&gt;' id='&lt;%# Sitecore.Context.Item.Name %&gt;'&gt;
    • 是的,肖恩说的。您在这里没有输出,因为 是一个“数据绑定表达式”并且您不是数据绑定。 是通用的“内联表达式”。输出必须是字符串。
    • 使用 和 sitecore 的问题是预览失败。而是将 DataBind() 添加到 Page_Load。我会更新我的答案以反映这一点。
    • 我最后选择了&lt;html xmlns="http://www.w3.org/1999/xhtml" id="&lt;%= Sitecore.Context.Item.Template.Name %&gt;" class="&lt;%= Sitecore.Context.Item.Name %&gt;"&gt;,因为我无法访问背后的代码,而且由于其他问题,无论如何也没有人使用 Sitecore 预览模式。谢谢大家 ;) 我想没有人可以快速链接到我可以在哪里找到所有可用内容的列表,例如 Sitecore.Context.Item.Template.Name?
    【解决方案2】:

    要获取 ID,您还需要返回当前项目的祖先,直到找到具有 Home 父级的项目,这将为您提供您的 Shop 项目。

    理想情况下,您应该在代码隐藏中执行此操作,而不是在 ASPX 中内联。您说您对 ASP.NET 不熟悉,如果遇到问题,请添加评论,看看是否有人可以进一步提供帮助。

    在您的 ASPX 中:

    <html xmlns="http://www.w3.org/1999/xhtml" id="Html" runat="server" >
    

    然后在你的代码后面,即在 LayoutMain.aspx.cs 文件中:

    protected void Page_Load(object sender, EventArgs e)
    {
        Html.ID = GetHtmlID();
        Html.Attributes["class"] = GetHtmlClass();
    }
    
    protected string GetHtmlID()
    {
        Sitecore.Data.Items.Item currentItem = Sitecore.Context.Item;
    
        while ( currentItem.Parent != null && currentItem.Parent.Name != "Home" )
        {
            currentItem = currentItem.Parent;
        }
    
        return (currentItem.Parent.Name == "Home") ? currentItem.Name : String.Empty;            
    }
    
    protected string GetHtmlClass()
    {
        return string.Format( "{0} {1}", Sitecore.Context.Item.Name, Sitecore.Context.Item.Template.Name );
    }
    

    此处的 GetHtmlID 方法将尝试查找以 Home 为父级的祖先(例如 Shop)。如果不能,那么您最终将没有 ID,或者您可以更改 String.Empty 以输入默认 ID。

    请注意,这会将 Home 模板名称直接硬编码到您的代码中,理想情况下,最好将其移出到配置中,或者使用不太可能更改的 Home 项目的 Sitecore ID 与 Parent.ID 匹配。但是,我想无论如何您都很少会重命名 Home 项目。

    【讨论】:

    • 这看起来很棒,完全像 The Right Way™ 那样做,但在我可以访问背后的代码之前,我将不得不解决第一个答案。谢谢!
    • 如果您确实需要正确设置该 ID,您仍然可以将该代码直接放入 ASPX 文件中。查看herehere 了解有关将代码直接放入您的ASPX 文件的更多信息。这不是最佳实践,但它会在紧要关头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多