1

这是参考并与我之前的问题有关

我正在尝试阅读如下代码所示Title的部分:TitlePart

var query = Services.ContentManager.Query("SideBarLinks").List();
foreach (var sideBarLinks in query)
        {
            foreach(var part in sideBarLinks.Parts)
            {
                if (part is Orchard.Core.Title.Models.TitlePart)
                {
                    // Below Line throws error
                    //string title = part.Title;
                }
            }
        }

每个 ContentPart 在果园中都有一个标题。所以对于 TitlePart,我正在尝试阅读 Title。还有任何类似的属性可以访问part.Name吗?

也检查了代码,并且有一个 PublicTitle属性,如下所示:

在此处输入图像描述

4

1 回答 1

1

并非所有内容类型都附加了 TitlePart。您可以在仪表板中检查这一点,并查看您的内容类型是否确实附加了标题部分。例如,页面内容类型:

在此处输入图像描述

在代码中,如果内容项具有标题部分,您可以像这样检查:

var query = Services.ContentManager.Query("SideBarLinks").List();
foreach (var sideBarLinks in query) {
    // Cast to TitlePart
    var titlePart = sideBarLinks.As<TitlePart>();
    var title = titlePart != null ? titlePart.Title : string.Empty;

    // Or:
    // var title = sideBarLinks.Has<TitlePart>() ? sideBarLinks.As<TitlePart>().Title : string.Empty;
}

获取内容项的显示文本的最安全和推荐的方法是使用项元数据:

var query = Services.ContentManager.Query("SideBarLinks").List();
foreach (var sideBarLinks in query) {
    // Get display text of the item
    var title = Services.ContentManager.GetItemMetadata(sideBarLinks).DisplayText;
}

这具有多个优点。第一个是您不必检查标题部分,方法本身会解决这个问题。另一个优点是您可以覆盖要显示为标题的内容。假设您有一个电影内容类型,并且您希望标题显示为“某些电影标题 (2001)”。然后,您唯一需要做的就是在您的自定义部分中实现 ITitleAspect:

public class MoviePart : ContentPart<MoviePartRecord>, ITitleAspect {

    // Shortcut to get the title
    public string MovieTitle {
        get { return this.As<TitlePart>().Title }
    }

    public int ReleaseYear {
        get { return Retrieve(x => x.ReleaseYear); }
        set { Store(x => x.ReleaseYear, value); }
    }

    // other properties

    // Implement Title from ITitleAspect
    public string Title {
        get { return string.Format("{0} ({1})", MovieTitle, ReleaseYear); }
    }
}

然后GetItemMetadata(theMovie).DisplayText该项的 将返回格式化的标题;

于 2015-10-12T08:06:05.670 回答