如何使用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.XmlSystem.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>

如何使用c# /ASP.NET访问XML对象/控件中的控件

这行不通。

<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,还是转换超出了您的控制?