private DotvvmControl GetSeparator(IDotvvmRequestContext context) { var placeholder = new PlaceHolder(); placeholder.SetDataContextType(this.GetDataContextType()); SeparatorTemplate.BuildContent(context, placeholder); return(placeholder); }
/// <summary> /// Performs the master page nesting. /// </summary> private void PerformMasterPageComposition(DotvvmView childPage, DotvvmView masterPage) { if (!masterPage.ViewModelType.IsAssignableFrom(childPage.ViewModelType)) { throw new DotvvmControlException(childPage, $"Master page requires viewModel of type '{masterPage.ViewModelType}' and it is not assignable from '{childPage.ViewModelType}'."); } // find content place holders var placeHolders = GetMasterPageContentPlaceHolders(masterPage); // find contents var contents = GetChildPageContents(childPage, placeHolders); // perform the composition foreach (var content in contents) { // find the corresponding placeholder var placeHolder = placeHolders.SingleOrDefault(p => p.ID == content.ContentPlaceHolderID); if (placeHolder == null) { throw new DotvvmControlException(content, $"The placeholder with ID '{content.ContentPlaceHolderID}' was not found in the master page '{masterPage.GetValue(Internal.MarkupFileNameProperty)}'!"); } // replace the contents var contentPlaceHolder = new PlaceHolder(); contentPlaceHolder.SetDataContextType(content.Parent.GetDataContextType()); (content.Parent as DotvvmControl)?.Children.Remove(content); placeHolder.Children.Clear(); placeHolder.Children.Add(contentPlaceHolder); contentPlaceHolder.Children.Add(content); content.SetValue(Internal.IsMasterPageCompositionFinishedProperty, true); content.SetValue(DotvvmView.DirectivesProperty, childPage.Directives); content.SetValue(Internal.MarkupFileNameProperty, childPage.GetValue(Internal.MarkupFileNameProperty)); } // copy the directives from content page to the master page (except the @masterpage) masterPage.ViewModelType = childPage.ViewModelType; }