有没有更好的方法来转换使用嵌套 ITemplate 的 Web Control 以在 Razor 中使用

本文关键字:Control Web 以在 Razor ITemplate 嵌套 转换 更好 有没有 方法 | 更新日期: 2023-09-27 18:31:35

我正在将旧的aspx/ascx页面转换为现在使用Razor,并且我遇到了一个不能轻易成为帮助程序方法或cshtml的WebControl。

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

这是剃刀所能做到的最好的吗?

我唯一能想到的另一件事是将 HTML 按原样放置在页面上并使用 JavaScript 模块然后使用新的容器div 修改内部部分,但我不明白为什么这项工作不能留在服务器端。

有没有更好的方法来转换使用嵌套 ITemplate 的 Web Control 以在 Razor 中使用

最好的方法是使用 jQuery。在jquery中,你可以使用类似$( "p" ).addClass( "myClass yourClass" );的东西。如果有"p",它将在其上添加相关类,如果没有,则不会发生任何事情。另一种选择是用灯箱替换其他控件,例如引导模式。