2012-05-24 17 views
5

Mam ContainerWidget i niestandardowy typ kontenera z pola ShowAllLinkCaption. Teraz mam tylko jedno rozwiązanie i wygląda na brzydkie. Jaki jest właściwy sposób uzyskania wartości tego pola w widoku Widoku kontenera?Orchard CMS: Właściwy sposób na uzyskanie wartości pola z widoku?

@*Latest news widget*@ 
@using Orchard.ContentManagement 
@using Orchard.Utility.Extensions 
@{ 
    var contentId = (int)Model.ContentItem.ContainerWidgetPart.Record.ContainerId; 
    IContentManager contentManager = WorkContext.Resolve<IContentManager>();  
    var customListContentItem = contentManager.Get(contentId); 
    var showAllLinkCaptionField = customListContentItem.Parts.SelectMany(p => p.Fields).First(f => f.Name == "ShowAllLinkCaption"); 
    var showAllLinkCaptionText = showAllLinkCaptionField.Storage.Get<string>(null); 
} 
@Display(Model.Content) 
@Html.Link(showAllLinkCaptionText, Url.ItemDisplayUrl(customListContentItem)) 

Odpowiedz

13

ContentItem to obiekt dynamiczny, który umożliwia bezpośredni dostęp do części i pól bez konieczności używania tych brzydkich Lambdas. Musisz tylko znać nazwę części, która ma pole, i możesz to zrobić:

someContentItem.ThePartThatHasTheField.TheField.TheNameOfThePropertyYouWantToAccess 
+0

Bardziej znakomita pomoc Bertranda ... Zastanawiam się, jak można to zrozumieć bez jego pomocy! –

+0

Bertrand dał świetnego anwsera, który był dokładnie tym, czego szukałem! Coś w rodzaju "Świętego Graala" Orcharda i co sprawia, że ​​Orchard jest tak wielki ... Ale wiedziałeś, że nadchodzi "ale", prawda? ;) Mam to: 'currentUser.UserCulturePart.Fields [0] .Value;' I działa świetnie. Mam również pętlę foreach, która wykonuje pętle przez pola tej części treści i wyświetla jej nazwy. To tylko 1 pole o nazwie "Kultura". Ale jeśli próbuję uzyskać do niego dostęp w ten sposób: 'currentUser.UserCulturePart.Culture.Value' to wyrzuca błąd, który nie zawiera kultury ... Jakieś pomysły? –

+0

Odnośnie mojego ostatniego komentarza. Miałem .WithField ("Culture") w mojej migrationations.cs ... może dobrze napisać, aby umieścić .Trim() podczas ich zapisywania? Ponieważ jest to bardzo trudne do debugowania i używanie nazw pól, które zawierają spacje, jest niemożliwe. Udało mi się już złamać kod za pomocą spacji w nazwach pól. –

Powiązane problemy