2017-10-27 9 views
0

내 사이트에 몇 가지 스타일/템플릿이 있습니다. 이 템플릿은 모두 내 사이트의 모든 작품에 사용됩니다. 다음은 내 문서 유형의 예입니다.Umbraco에서 동적 합성 모델의 속성에 액세스 할 수 있습니까?

Layouts (folder) 
    Style 1 
    Style 2 
    Style 3 
Products (folder) 
    ProductsPage 
    Product 
News (folder) 
    NewsOverview 
    NewsPage 

기본적으로 모양이 같습니다. 이들 모두는 ProductNewsPage을 제외한 템플릿을 가지고 있지만, 이들은 조성물로서 Style X을 갖는다. 내 콘텐츠 노드 모양은 다음과 같습니다.

Home 
    Products 
     Product 1 (Style 2) 
     Product 2 (Style 3) 
     Product 3 (Style 2) 
     Product 4 (Style 1) 
    News 
     Article 1 (Style 1) 
     Article 2 (Style 3) 

등등. 너는 요점을 알아 내지? Style X 문서 유형은 모두 작곡이므로 동일한 페이지를 반복해서 반복 할 필요는 없지만 원하는 스타일의 페이지를 만들 수 있습니다.

이제 부모님 (예 : NewsOverview)에서 자녀의 속성에 액세스하고 싶습니다. NewsOverview 템플릿 파일의 내부에서, 나는 다음이해야 할 것 : 내 모델이 DLL이 설정되어 있지만

@foreach(var article in Model.Content.Children) { 
    dynamic image = article; 
    <img src="@image.OverviewImage[0].Url" /> 
    <p>@article.GetPropertyValue("overviewTitle")</p> 
} 

내가 문자열을 사용 또는 동적 (기본적으로)에 캐스팅없이 속성에 액세스 할 수없고 나는 보통 Model.Content.PROPERTY을 수행 할 수 있습니다 인텔리 센스 등등.

어떻게하면됩니까? 동적 속성을 사용하지 않고 속성에 액세스하려면 어떻게해야합니까? 나는 아이들이 반드시 똑같은 것은 아니라는 것을 이해합니다. 그러나 모든 스타일이 지정된 페이지에는 동일한 속성이 포함되어 있습니다. 템플릿은 템플릿에서 다르게 배열됩니다. 때문에,

@using ContentModels = Umbraco.Web.PublishedContentModels; 

@foreach (var article in Model.Content.Children.Select(child => new ContentModels.NewsPage(child)) { 
    <img src="@article .OverviewImage.First().Url" /> 
    <p>@article.OverviewTitle</p> 
} 

.Children() 단지 형 IPublishedContent의 아이를 가져옵니다

+0

제품 1 (스타일 2)의 의미를 알 수 없습니다. 당신은 제품 노드를 만들었습니다. (작곡에는 style1-2-3의 모든 속성이 있습니다) 그리고 스타일 2 만 채웠습니까? – Eyescream

+0

@Eyescream 다른 스타일과 기본적으로 같은 속성을 가진'Style 1'이라는 doctype이 있습니다. 유일한 차이점은 템플릿입니다. 사용자 (나)가 각 페이지에 사용할 템플릿을 선택할 수 있기를 바랍니다. 어떤 페이지는 다른 텍스트보다 더 많은 텍스트를 가질 수 있고, 더 많은 이미지와 다른 이미지 등을 가질 수 있습니다. '스타일 1'은 템플릿이있는 단순히 doctype이며, 'Product' doctype에 대한 구성입니다. – MortenMoulder

+0

하나의 DocType 권한에 여러 템플릿을 할당 할 수 있다는 것을 알고 계십니까? 그런 다음 하나의 페이지를 만들 때 사용할 페이지를 선택하십시오. 새로운 템플릿을 갖기 위해 새로운 DocType이 필요하지 않습니다. 당신이 제대로 질문하는 것을 이해한다면, 아니오, 당신은 구성된 doctypes에서 여러 템플릿을 사용할 수 없습니다. 상위 doctype의 템플리트 만 사용됩니다. 컴포지션은 Model Builder의 인터페이스 일뿐입니다. –

답변

0

당신은 템플릿?

@inherits UmbracoViewPage<ContentModels.Product> 
@using ContentModels = Umbraco.Web.PublishedContentModels; 
0
당신은 아마도 특정 유형의 아이들을 캐스팅 할 필요가

에 상위 모델을 추가 한 ModelsBuilder는 현재 페이지 아래에 존재할 수있는 문서 유형을 모릅니다.

+0

정말 쉽게 아이들을 캐스팅 할 수 있습니다. 콘텐츠 모델은 여전히 ​​게시 된 콘텐츠입니다. 모델을 다시 작성할 필요가 없습니다. – Tim

1

는 특정 유형의 모든 하위 문서를 얻을 수있어 안전하게 foreach 문에 캐스팅 될 수 Children<T>()라는 방법있다 :

@foreach(Article article in Model.Content.Children<Article>()) { 
    <img src="@article.OverviewImage.First().Url" /> 
    <p>@article.OverviewTitle</p> 
} 

당신은 아마 article.OverviewImage.First() 주위에 약간의 로직을 추가 할 수 있습니다 것처럼이 OverviewImage에 대한 값이 없으므로 null 참조 예외가 발생합니다.