1

これは、以前の質問hereを参照して関連しています。

以下のコードに見られるように、私は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 については、タイトルを読み取ろうとしています。また、次のようにアクセスできる同様のプロパティはあります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;
}

これには複数の利点があります。最初の 1 つは、タイトル部分をチェックする必要がないことです。メソッド自体がそれを処理します。もう 1 つの利点は、タイトルとして表示するものをオーバーライドできることです。映画のコンテンツ タイプがあり、タイトルを「映画のタイトル (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 に答える