如何使用c# /ASP.NET访问XML对象/控件中的控件
本文关键字:控件 对象 XML NET 何使用 ASP 访问 | 更新日期: 2023-09-27 17:50:08
我是XML/XSLT的新手。我所做的是创建一个带有列表的XML文件,并使用XSLT对其进行转换。
代码如下:
protected void Page_Load(object sender, EventArgs e)
{
this.form1.Controls.Add(Xml1);
Button btnSubmit = new Button();
btnSubmit.Text = "Submit";
this.form1.Controls.Add(btnSubmit);
btnSubmit.Click += new System.EventHandler(btnSubmit_Click);
Xml1.DocumentSource = "~/xml/XML_F52E2B61-18A1-11d1-B105-00805F49916B1.xml";
Xml1.TransformSource = "~/KPI_table.xslt";
//Together, the Xml1.DocumentSource and the Xml1.TransformSource will display a
//list of items with a dropdownlist each.
}
private void btnSubmit_Click(Object sender, System.EventArgs e)
{
foreach (Control c in form1.Controls) //or is it possible to access the controls
//inside XML1 here?
{
//This is where I need to access the controls inside the Xml1 object.
}
}
当我试图调试/跟踪程序时,我发现foreach循环只看到3个控件(System.Web.UI.LiteralControl
, System.Web.UI.WebControls.Xml
和System.Web.UI.WebControls.Button
)。我找不到一种方法来进入xml对象/控件内的控件,所以我可以得到下拉列表/选项的SelectedValue
。我如何能够访问Xml1对象/控件中的控件??
更新2:这是生成的HTML代码:
<body>
<form method="post" action="Main.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZCn80c6JtFOE8ISKTFArpEqY4qC8tA9LkNAs7gn6n6Zu" />
</div>
<div class="aspNetHidden">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLm9oEzAqDAiY0LmVXxKZ8kddyJnX1LgEhJf4qGDJE14PdWmMUYC7LLAAk=" />
</div>
<div>
</div>
<table id="tbl1" runat="server" xmlns:asp="remove">
<tr>
<td>BEHAVIOR</td>
</tr>
<tr>
<td>Stellar KPIs</td>
</tr>
<tr>
<td>Customer Demeanor at Start of call:</td>
<td>
<select id="ddl_3" runat="server" AutoPostBack="true" onchange="getvalue(this);">
<option value="0">Select</option>
<option value="A"> Audibly Happy</option>
<option value="N"> Neutral</option>
<option value="I"> Irate</option>
<option value="R"> At risk</option>
</select>
</td>
</tr>
<tr>
<td>Customer Demeanor at End of call:</td>
<td>
<select id="ddl_8" runat="server" AutoPostBack="true" onchange="getvalue(this);">
<option value="0">Select</option>
<option value="A"> Audibly Happy</option>
<option value="N"> Neutral</option>
<option value="I"> Irate</option>
<option value="R"> At risk</option>
</select>
</td>
</tr>
更新3:这是渲染的HTML代码的截图:截图
更新4:这是XSLT文件
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:asp="remove" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>
<xsl:template name="home" match="/">
<table id="tbl1" runat="server">
<xsl:for-each select="ProgramKPI/KPIs">
<xsl:variable name="varKPI" select="KPI_ID"/>
<xsl:choose>
<xsl:when test="Level = '1'">
<tr>
<td>
<xsl:value-of select="Attribute"/>
</td>
</tr>
</xsl:when>
<xsl:when test="Level = '2'">
<tr>
<td>
<xsl:value-of select="Attribute"/>
</td>
</tr>
</xsl:when>
<xsl:when test="Level = '3'">
<tr>
<td>
<xsl:value-of select="Attribute"/>
</td>
<xsl:variable name="ddl_name" select="concat('ddl_', KPI_ID)"/>
<td>
<xsl:element name="select">
<xsl:attribute name="id"><xsl:value-of select="concat('ddl_', KPI_ID)"/></xsl:attribute>
<xsl:attribute name="runat">server</xsl:attribute>
<xsl:attribute name="AutoPostBack">true</xsl:attribute>
<xsl:attribute name="onchange">getvalue(this);</xsl:attribute>
<xsl:element name="option">
<xsl:attribute name="value"><xsl:value-of select="0"/></xsl:attribute>
<xsl:value-of select="'Select'"/>
</xsl:element>
<xsl:for-each select="//Parent_KPI[.=$varKPI]">
<xsl:element name="option">
<xsl:attribute name="value"><xsl:value-of select="preceding-sibling::AttributeCode"/></xsl:attribute>
<xsl:value-of select="preceding-sibling::Attribute"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
<!--<asp:DropDownList id="{concat('ddl_', KPI_ID)}" runat="server">
<asp:ListItem value="0"> Select
</asp:ListItem>
<xsl:for-each select="//Parent_KPI[.=$varKPI]">
<asp:ListItem>
<xsl:attribute name="value">
<xsl:value-of select="preceding-sibling::AttributeCode"/>
</xsl:attribute>
<xsl:value-of select="preceding-sibling::Attribute"/>
</asp:ListItem>
</xsl:for-each>
</asp:DropDownList>-->
</td>
</tr>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
这行不通。
像<asp:DropDownList/>
这样的文本需要由ASP解释。. NET以便被视为控件。你只是把那个文本发送给浏览器。
尝试检查子控件。理想情况下,您可以递归地执行此操作,但这是一种快速而肮脏的方式:
private void btnSubmit_Click(Object sender, System.EventArgs e)
{
foreach (Control c in form1.Controls)
{
if (c.HasControls())
{
foreach (Control child in c)
{
//Access Child controls here
}
}
}
}
也就是说,我不确定是否可以通过这种方式通过XML向页面添加控件。
你也可以在页面生命周期的早期添加控件,可能是onInit事件,并确保在回发时不要再次添加控件。
更新:根据约翰桑德斯的回答:你可以走老路,使用request对象来访问值,而不是。net,但它应该可以工作。例句:
string dropDownValue = Request.Form["yourDropDownID"];
更新2 要遍历返回的值,可以执行以下操作:
private void btnSubmit_Click(Object sender, System.EventArgs e)
{
foreach (string key in Request.Form.AllKeys)
{
Response.Write (string.Format("{0} => {1}<br />", key, request.Form[key]));
}
}
但是,要做到这一点,您需要确保呈现的HTML具有表单元素的name属性。将select元素的XSLT更改如下:
<xsl:element name="select">
<xsl:attribute name="id">
<xsl:value-of select="concat('ddl_', KPI_ID)"/>
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="concat('ddl_', KPI_ID)"/>
</xsl:attribute>
<xsl:attribute name="onchange">getvalue(this);</xsl:attribute>
<xsl:element name="option">
<xsl:attribute name="value">
<xsl:value-of select="0"/>
</xsl:attribute>
<xsl:value-of select="'Select'"/>
</xsl:element>
注意,这里包含了name属性,并删除了runat服务器和自动回发属性。
您说XML和转换产生一个下拉列表—它们是普通的html标记,还是它创建asp.net控件?
我似乎记得,你只能从代码后访问控件,如果他们有一个ID属性和runat="server"设置在标签。
如果它们是纯html,您可以影响转换,使它包括一个ID和runat="server"当它应用于xml,还是转换超出了您的控制?