c# - 将数据传递给服务器控件中的子控件的正确模式

标签 c# asp.net .net-3.5 servercontrols

我正在使用第 3 方系统在网站中实现某些表格。

第 3 方系统为我提供了这些表单的 XML 定义。 例如

<form>
    <segment>
        <label>The header</label>
        <fields>
            ...
            <field>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
            ...
        </fields>
    </segment>
    ...
</form>

我在服务器控件中解析此 XML 并以编程方式生成控件树。控件的标签在 XML 中传递。

我们建议将少量帮助文本“注入(inject)”到此表单中,这是我们提议的一部分。

理想情况下,我想从顶级控件的标记中传递这些帮助文本,以便非开发人员(HTML monkies)可以更改帮助文本,并通过它的 ID 将它们与字段相关联。像这样

<controls:MyCrazyForm runat="server">
    <helpTexts>
        <helpText for="field_Dob">
Some rambling nonsense to do with the DOB field
        </helpText>
        ...
    </helpTexts>
</controls:MyCrazyForm>

递归解析控件。

表单为每个段创建一个字段集,字段集根据数据类型创建许多 FieldXXX(其中 XXX = 日期、文本、组合框等)。

FieldXXX 类型创建一个 div,然后创建几个标准的 .net 控件(TextBox、DropDownList 等)来实际呈现它们自己。此时,我需要在包含的 div 中输出帮助文本。

我的问题

将这些文本从顶级表单控件获取到控件树中深 3 或 4 级的这些子控件的“最佳”方法是什么。

页面上只会出现这些表单中的一种。 我是否应该将顶级表单设置为 Singleton 并像这样获取它...?

if(MyCrazyForm.Instance.HelpTexts.ContainsKey("theIdOfTheCurrentField"))
{
    this.HelpText = MyCrazyForm.Instance.HelpTexts["theIdOfTheCurrentField"];
}

我是否应该将对表单的引用一直传递到树下的每个控件(这看起来很困惑)?

我的架构(虽然目前它工作得很好)形式是否达到了目标,我应该看看不同的实现方法吗?

谢谢

最佳答案

一开始可能比较复杂,但维护起来更容易,为什么不通过xsl处理器运行xml文件呢? xslt 文件会将您的帮助文本文件的帮助文本节点分配给相应的字段节点。

 <?xml version="1.0" encoding="ISO-8859-1"?>
<form>
    <segment>
        <label>The header</label>
        <fields>
            <field>
                <id>field_name</id>
                <type>string</type>
                <label>Name</label>
                <required>1</required>
            </field>
            <field>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
        </fields>
    </segment>
</form>

XSLT 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/form/segment/fields/field[id='field_name']">
    <xsl:copy>
      <xsl:element name="helptext">This is a Name helptext.</xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/form/segment/fields/field[id='field_Dob']">
    <xsl:copy>
      <xsl:element name="helptext">This is a Date of birth helptext.</xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

    <xsl:template match="node() | text()">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

产生这个:

<form>
    <segment>
        <label>The header</label>
        <fields>
            <field>
<helptext>This is a Name helptext.</helptext>
                <id>field_name</id>
                <type>string</type>
                <label>Name</label>
                <required>1</required>
            </field>
            <field>
<helptext>This is a Date of birth helptext.</helptext>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
        </fields>
    </segment>
</form>

现在可以像以前一样解析此 xml 文件,但现在您可以在生成表单元素的同时获得帮助文本。然后您的 HTML monkies 只需要编辑 XSLT 文件,或者您只需包含另一个文件:

  <xsl:template match="/form/segment/fields/field[id='field_Dob']">
    <xsl:copy>
      <xsl:element name="helptext">
        <xsl:copy-of select="document('field_Dob.txt')"/> 
      </xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

您可以在线试用 XSL here

关于c# - 将数据传递给服务器控件中的子控件的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109680/

相关文章:

asp.net - 在 ASP.net 中如何确定上传的文件不是病毒?

.net - 如何创建自定义 *write-only* 依赖属性?

.net - nAnt 是否仍受支持并适用于 .net 3.5/VS2008?

C#,MySQL 对象引用未设置为对象实例错误

c# - Thread.Abort() 损坏是否已本地化?

c# - 在 Unity 中将图层和位掩码与光线转换一起使用

c# - 如何为角色和特定用户使用自定义授权属性?

c# - 如何在 Entity Framework 中使用继承类的字段

c# - .Net 标准的自定义 System.Web.HttpContext

c# - 具有多个计时器的 Windows 服务