2015-10-12 5 views
1

Это ссылка и мой предыдущий вопрос here.Невозможно прочитать Название TitlePart | Orchard CMS 1.7 |

Я пытаюсь читать 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?

Проверил код, а также и есть Title свойство Public, как показано ниже:

enter image description here

ответ

1

Не все типы контента имеют TitlePart прилагается. Вы можете проверить это в своей информационной панели и посмотреть, действительно ли у вашего типа контента заголовок, прикрепленный к нему. Например, тип содержимого страницы:

enter image description here

В коде вы можете проверить, как это, если элемент контента имеет заголовок часть:

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 этого пункта, то будет возвращать форматированный название;

+0

Да, мой собственный тип контента: SideBarLinks имеет прикрепленную часть «Название». Также не могли бы вы рассказать мне, где эта вещь METADATA? Я имею в виду свойство DisplayText, которое вы использовали, поэтому я могу проверить это в Orchard CMS, например, как все PARTS и PRoperties перечислены в скриншоте/верхнем изображении, представленном выше? –

+0

Большое спасибо devqon. Все ваши упомянутые способы отлично работали. Особая благодарность за разъяснение ITitleAspect. это действительно информативно. –

 Смежные вопросы

  • Нет связанных вопросов^_^