有没有更好的方法来转换使用嵌套 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 修改内部部分,但我不明白为什么这项工作不能留在服务器端。
最好的方法是使用 jQuery。在jquery中,你可以使用类似$( "p" ).addClass( "myClass yourClass" );
的东西。如果有"p",它将在其上添加相关类,如果没有,则不会发生任何事情。另一种选择是用灯箱替换其他控件,例如引导模式。