internal CompiledCode GetSnippetRenderCode(string cacheKey, SnippetControl snippetControl) { CompiledCode compiledSnippet = (CompiledCode)_buildResult.CompiledSnippets[cacheKey]; if (compiledSnippet == null) { lock (_buildResult.CompiledSnippets) { compiledSnippet = (CompiledCode)_buildResult.CompiledSnippets[cacheKey]; if (compiledSnippet == null) { // It's not cached, so ask the control for the CodeDom tree and compile it CodeMemberMethod codeDomMethod = snippetControl.GenerateRenderMemberMethod(_templateControlVirtualPath); compiledSnippet = EngineHelper.CompileCodeDom(codeDomMethod, ScriptEngine); // Cache it _buildResult.CompiledSnippets[cacheKey] = compiledSnippet; } } } return(compiledSnippet); }
/// <summary> /// Adds the snippet info from the PageAssembly instruction for each /// page template slot. Use the ID of the template slot control to match /// the snippet info slotname property. /// </summary> private void loadSnippetsIntoTemplateSlots() { if (TemplateSlots.Count > 0) { List <SnippetControl> supportingSnippets = new List <SnippetControl>(); foreach (SnippetInfo snippet in this.SnippetInfo.Snippets) { if (!String.IsNullOrEmpty(snippet.SlotName)) { string slotName = snippet.SlotName.Trim(); if (TemplateSlots.ContainsSlotName(slotName)) { try { SnippetControl snippetControl = (SnippetControl)Page.LoadControl(snippet.SnippetTemplatePath.Trim()); // Note this has to come before adding the template control to the control tree. // This way, we can be sure any event in the control lifecycle like OnInit() // already has the snippet info data. snippetControl.SnippetInfo = snippet; TemplateSlots[slotName].AddSnippet(snippetControl); // Some snippetcontrol implement the ISupportingSnippet interface. // The controls which implement ISupportingSnippet will provide additional // snippet control that are required for the complete functionality. // Add them to a collection that will be processed later. if (snippetControl is ISupportingSnippet) { SnippetControl[] supportingcontrols = ((ISupportingSnippet)snippetControl).GetSupportingSnippets(); if (supportingcontrols != null) { supportingSnippets.AddRange(supportingcontrols); } } } catch (Exception ex) { //Failed to load the slot template control. Log this error. log.Error("Failed to load snippet control-" + snippet.SnippetTemplatePath, ex); } } } } foreach (SnippetControl supportSnippet in supportingSnippets) { try { if (TemplateSlots.ContainsSlotName(supportSnippet.SnippetInfo.SlotName)) { TemplateSlots[supportSnippet.SnippetInfo.SlotName].AddSnippet(supportSnippet); } } catch (Exception ex) { log.Error("Failed to add supporting snippet control", ex); } } } }