Я конвертирую старые страницы 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, но я не понимаю, почему эта работа не может оставаться на стороне сервера .