ASP.NET自定义模板控件 - 有没有办法修改数据绑定数据的输出位置?

时间:2010-08-31 15:15:37

标签: asp.net custom-server-controls controltemplates

基本上,我有一个带有自定义数据容器类的自定义模板化控件。当开发人员将我的控件实例添加到页面时,他们可以在LayoutTemplate中定义控件,但是他们喜欢,如下所示:

    <ml:MyControl id="MyControl1" runat="server">
        <LayoutTemplate>
            <span><%#Container.ErrorMessage%></span>
        </LayoutTemplate>
    </ml:MyControl>

此示例在页面上呈现如下:

<span id="MyControl1"><span>
            <span>ml_errormessage</span>

        </span></span>

我希望我的控件能够自动将“ml_errormessage”(来自Container.ErrorMessage的数据绑定内容 - 属性中的硬编码标记)移动为其包含元素的类,以便jQuery更容易使用选择器来查找元素并动态插入错误消息客户端。更重要的是,我希望它不会被移除,所以类名不会被内容取代,jQuery可以在页面生命周期中找到它所需的次数。换句话说,我希望输出看起来像这样,没有开发人员更改输入模板或使用模板中的自定义控件:

<span id="MyControl1"><span>
            <span class="ml_errormessage"></span>

        </span></span>

我想使用控件集合移动值,而不是依靠输出的字符串解析,如果可能的话。但是,当我在OnPreRender的覆盖中询问集合时,模板中的控件在调试器中看起来像这样:

{System.Web.UI.DataBoundLiteralControl}
System.Web.UI.DataBoundLiteralControl: {System.Web.UI.DataBoundLiteralControl}
AppRelativeTemplateSourceDirectory: "~/"
BindingContainer: {MyControls.MyControlData}
ClientID: "MyControl1_ctl01_ctl00"
Controls: {System.Web.UI.EmptyControlCollection}
EnableTheming: True
EnableViewState: True
ID: "ctl00"
NamingContainer: {MyControls.MyControlData}
Page: {ASP.default_aspx}
Parent: {MyControls.MyControlData}
Site: Nothing
SkinID: ""
TemplateControl: {ASP.default_aspx}
TemplateSourceDirectory: "/MyControls"
UniqueID: "MyControl1$ctl01$ctl00"
Visible: True

正如您所看到的,“ml_errormessage”值无处可寻。在使用Reflector分析Control类的DataBind事件后,我看到它将绑定行为委托给每个控件。换句话说,每个控件都处理自己的数据绑定。但是,由于我无法预先知道模板中的控件类型,如何进行此更改?

注意:可接受的替代方法是在“ml_errormessage”所在的确切位置添加新的HtmlGenericControl(span),并将其作为类添加到此新控件中。

另一方面,是否有一种简单的方法可以将控件的输出缩进以便在调试过程中轻松读取?

1 个答案:

答案 0 :(得分:1)

发布此消息后仅几秒钟,我想到了一个简单的解决方案......只需硬编码"<span class=""ml_errormessage""></span>"作为我的容器属性ErrorMessage的结果。

当然,它增加了一个额外的不必要的<span>元素,但如果最终开发人员决定将其他元素与数据绑定值一起放置,它也会更安全。