2012-05-21 2 views
4

У меня есть скрипт бритвы в Umbraco, который довольно сложный, и я хочу, чтобы в какой-то момент он отображал в нем макрос.Umbraco - Render .Net User Control (ascx) macro with Razor

Макрос, который называется SuggestionBox фактически пользовательский элемент управления (.ascx) и традиционно это ссылается на шаблон с использованием

<umbraco:macro Alias="SuggestionBox" language="cshtml" runat="server"></umbraco:macro> 

Но теперь мне нужно вызвать из сценария вместо бритвы, так что я пытался ;

@Html.Raw(umbraco.library.RenderMacroContent("SuggestionBox", Model.Id)) 

, а также:

@RenderPage("SuggestionBox") 

Не повезло так далеко, как я уверен, что я использую это неправильно.

Я читал где-то, что это может быть неосуществимо, если страница завернута в главную страницу.

Это работает, если добавить его в шаблон, как я традиционно будет:

<umbraco:macro Alias="EventsRenderer" language="cshtml" runat="server"></umbraco:macro> 
<div class="talkingPointPanel"> 
    <h3><umbraco:Item field="talkingPoinstSuggestionText" runat="server"></umbraco:Item></h3> 
    <umbraco:macro Alias="SuggestionBox" language="cshtml" runat="server"></umbraco:macro> 
</div> 

Где EventsRenderer отображает страницу, которая в идеале должна содержать SuggestionBox.

использованием

@Html.Raw(umbraco.library.RenderMacroContent("<?UMBRACO_MACRO macroAlias=\"SuggestionBox\" />", Model.Id)) 

дает мне эту ошибку:

<!-- Error generating macroContent: 'System.Web.HttpException (0x80004005): HtmlForm cannot render without a reference to the Page instance. Make sure your form has been added to the control tree. 

    at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) 

    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 

    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 

    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 

    at umbraco.presentation.templateControls.Macro.Render(HtmlTextWriter writer) 

    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 

    at umbraco.library.RenderMacroContent(String Text, Int32 PageId)' --> 

Любые идеи?

+1

Я не пробовал это с .Net контролем внутри Razor (только бритва внутри бритвы) и творит чудеса. @RenderPage («~/macroscripts/dotMailerMessageBox.cshtml») Даже если это не сработает для вас, это может быть полезно для кого-то другого. –

ответ

9
<umbraco:Macro runat="server" language="cshtml">@{ 

HtmlTextWriter writer = new HtmlTextWriter(this.Output); 
var navigation = new umbraco.presentation.templateControls.Macro(); 

navigation.Alias = "Navigation"; 
navigation.MacroAttributes.Add("ulclass", "art-vmenu"); 
navigation.MacroAttributes.Add("level", 2); 

navigation.RenderControl(writer); }</umbraco:Macro> 

Попробуйте что-то вроде этого. Это работает для меня ... Я создал навигационный макрос. Будьте внимательны, хотя ваши переменные должны быть указаны в toLower, если используются кепки, параметры не будут проходить.

+0

Спасибо! Этот комментарий о «ToLower» закончился несколько часов головокружения – Nellius

+0

Пожалуйста, проясните концепцию «toLower». Я застрял в этом. –

0

попробовать что-то вроде этого:

@Html.Raw(umbraco.library.RenderMacroContent("<?UMBRACO_MACRO macroAlias=\"SuggestionBox\" />", Model.Id)) 
+0

Я получаю эту ошибку: Nick

+0

Хм ... Я думаю, что ошибка исходит от пользовательского элемента управления. У вас есть проблемы с добавлением пользовательского макроса управления на вашу страницу стандартным способом (вне вашего бритвенного макроса)? Также может возникнуть конфликт, если ваша главная страница и ваш пользовательский элемент управления содержат теги формы. ASP.Net не любит вложенные теги формы. –

+0

Управление работает нормально, если я добавляю его в шаблон традиционным способом, но поскольку скрипт бритвы содержит много разметки, я хочу, чтобы он отображался в определенном месте на странице. Однако, как временное решение, у меня есть элемент управления, появляющийся внизу страницы после того, как содержимое сценария бритвы было отображено и что работает. – Nick

2

В Umbraco 4.10+ Для вызова макроса внутри Razor сценария, используйте:

@ Umbraco.RenderMacro ("macroNameHere", новый {propertyName1 = CurrentPage.pageProperty}))

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