我正在使用第 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/