如何轻松地为自定义asp.net Web窗体控件创建模板?

时间:2012-11-19 21:21:47

标签: c# asp.net webforms

我正在尝试制作它,因此我们为用户控件设置了一个代码,但不同的网站(很可能是页面)将需要自己的HTML模板。 html也需要由前端开发人员修改而不需要dll推送。

以前,我通过创建一个带有代码的标准ascx来绑定所有控件。然后我让前端开发人员制作ascx的副本并更改新ascx的标记(保留定义与原始版本完全匹配的代码)。然后有一个设置告诉控件使用哪个实际的ascx,并且所有内容都正确连接。

但是,我想知道是否有更好的方法来实现这一点,特别是因为删除一个站点不需要的asp控件(如标签)之类的简单操作会导致异常)

在一个理想的世界中,我更喜欢类似于MVC或MVP类型的系统,但我陷入纯粹的原始webforms系统,我需要添加自定义控件。

有没有比创建多个ascx共享相同代码的更好方法来实现模板?

请注意,模板的物理文件是必须的,以便我们可以跟踪源代码管理中的模板。

1 个答案:

答案 0 :(得分:1)

考虑到你的限制,我认为你正在分享代码隐藏的正确轨道。在您的要求中突出的一点是能够在不破坏代码隐藏的情况下删除控件。您可以通过在基类(当前代码隐藏)和ascx之间添加中间代码隐藏来实现此目的。

基类(重构的代码隐藏)

Public MustInherit Class BaseUC
Inherits System.Web.UI.UserControl

' Define all page controls here
Public MustOverride Property lblPageTitle As Label

Private Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

    ' Check if control has been initialized by inheriting class
    If lblPageTitle IsNot Nothing Then
        lblPageTitle.Text = "Hooray"
    End If

End Sub
End Class

新的特定于网站的代码

Partial Class controls_Sample
Inherits BaseUC

Public Overrides Property lblPageTitle As System.Web.UI.WebControls.Label
    Get
        Return title
    End Get
    Set(value As System.Web.UI.WebControls.Label)
        title = value
    End Set
End Property
End Class

特定于网站的ASCX

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="Sample.ascx.vb" Inherits="controls_Sample" %>

<asp:Label runat="server" ID="title"></asp:Label>