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

第三方系统为我提供了这些形式的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传递。

我们的建议之一是将少量帮助文本“注入”此表单。

理想情况下,我想从顶级控件的标记中传递这些帮助文本,以便非开发人员(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"];
}


我是否应该将对表单的引用一直传递到树中的每个控件中(这似乎很麻烦)?

我的这种格式(虽然目前可以很好地实现Realyl)的体系结构是否达到了目标,我是否应该考虑另一种实现方法?

谢谢

最佳答案

起初它可能更复杂,但是使维护更容易,为什么不通过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脚本就只需要编辑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/

10-17 01:58