我正在使用第三方系统来实现网站中的某些表格。
第三方系统为我提供了这些形式的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/