1

基本上,我有一个带有自定义数据容器类的自定义模板控件。当开发人员将我的控件的实例添加到页面时,他们可以根据自己的喜好在 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),并将其作为一个类添加到这个新控件中。

附带说明一下,是否有一种简单的方法可以让控件的输出缩进以便在调试期间轻松阅读?

4

1 回答 1

1

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

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

于 2010-08-31T15:29:41.053 回答