无法读取 TitlePart 的标题 |果园 CMS 1.7 |

Unable to read Title of TitlePart | Orchard CMS 1.7 |

这与我之前的问题有关

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

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 在 orchard 中都有一个标题。所以对于 TitlePart,我正在尝试阅读标题。还有没有类似的 属性 可以像 part.Name 一样访问?

也检查了代码,有一个 Public Title 属性 如下所示:

并非所有内容类型都附加了 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;
}

这有很多好处。第一个是您不必检查标题部分,该方法本身会处理它。 另一个优点是您可以覆盖要显示为标题的内容。假设您有一个电影内容类型,并且您希望标题显示为 "Some Movie Title (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 将 return 格式化标题;