Есть ли лучший способ преобразовать WebControl, который использует вложенные ITemplates, для использования в Razor?

Я конвертирую старые страницы aspx/ascx, чтобы теперь использовать Razor, и я столкнулся с WebControl, который не может легко стать вспомогательным методом или cshtml.

WebControl имеет несколько вложенных свойств ITemplate, например:

[ToolboxData("<{0}:LightBox runat=server></{0}:LightBox>")]
public class Lightbox : WebControl, INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Header { get; set; }
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Body { get; set; }
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Footer { get; set; }
}

Вот как он отформатирован в файле aspx/ascx:

<cc1:Lightbox ID="LightBox1" runat="server">
    <Header>Header HTML</Header>
    <Body>Body HTML</Body>
    <Footer>Footer HTML</Footer>
</cc1:Lightbox>

Если раздел существует, то метод CreateChildControls() заключает его в тег div с определенными классами. Это заканчивается так, но сложнее:

<div class="header">
    <div class="title">Header HTML</div>
</div>
<div class="body">Body HTML</div>
<div class="footer">Footer HTML</div>

Я не знаю хорошего способа сделать что-то подобное в Razor. Я мог бы превратить его в один или несколько вспомогательных методов. Однако это означает, что мне нужно либо передать HTML в виде строк, либо преобразовать каждый раздел ITemplate в этот «забавный» формат:

Func<dynamic, object> header = @<text>
    <span id="logo">
        <img src="@path" />
    </span>
</text>;
...
@LightBox(header, body, footer) // This would contain logic from CreateChildControls

Это лучшее, что возможно с Razor?

Единственное, что я могу придумать, это разместить HTML как есть на странице и использовать модуль JavaScript, чтобы затем изменить внутренние разделы с помощью новых контейнеров div, но я не понимаю, почему эта работа не может оставаться на стороне сервера .


person lukini    schedule 22.01.2016    source источник
comment
Почему вы продолжаете использовать лайтбокс?   -  person Hadee    schedule 23.01.2016
comment
@Хади, что ты имеешь в виду? Это WebControl, используемый на 49 страницах этого веб-сайта.   -  person lukini    schedule 25.01.2016
comment
Существуют инструменты для улучшения функциональности лайтбокса в MVC. как модальный бутстрап.   -  person Hadee    schedule 25.01.2016
comment
Это не настоящий лайтбокс. Впрочем, похоже, что один. Я понятия не имею, почему он так назван.   -  person lukini    schedule 26.01.2016


Ответы (1)


Лучший подход для вас — использование jQuery. В jquery вы можете использовать что-то вроде $( "p" ).addClass( "myClass yourClass" );. Если есть «p», он добавит связанный класс, если нет, ничего не произойдет. Другой вариант — заменить другие элементы управления лайтбоксом, например модальным окном начальной загрузки.

person Hadee    schedule 23.01.2016