4

我一直在处理这个问题几个小时,但找不到解决方案。现在我在一个 Web 应用程序中工作,我的第一个问题是我想动态创建一个 XML ......然后我意识到在回发之后,Xml 正在重置。然后我只是,“好的,让我们创建一个 HiddenField 并将节点作为字符串存储在 HiddenField 值属性中,所以最后我只创建一个新的 XmlElement,创建一个带有 HiddenField.Value 的 InnerXml 的文档片段并附加fragmentto XmlElement"...但是 HiddenField.Value 也会重置每次单击按钮...我刚刚用标签测试了这个方法,它可以工作...

基本上,我有一个页面被 AJAXControlToolKit TabContainer 控件分成两部分。第一个表单用于用户主要数据,而第二个选项卡有一个表单,旨在根据用户的需要多次填写表单,因为它用于存储家庭成员。所以过程是填写一个家庭成员数据,单击按钮并将其存储在 HiddenField.Value 中,填写第二个家庭成员数据并再次单击以添加新的家庭成员并连接到 HiddenField.Value...但是我意识到在第一次单击 Load Page 方法后, HiddenField.Value 再次为空...

也许不是那么重要,但在 UpdatePanel 上只有按钮和一个列表框,用于显示用户保存的所有家庭成员的一些数据,因此在单击时唯一刷新的对象是列表框。

正如我刚才所说,如果改为使用 HiddenField.Value 我使用 Label.Text,一切正常......

<%@ Page Language="c#" MasterPageFile="/Plantilla.master" AutoEventWireup="true" Inherits="alta_personal_interno" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="cc1" %>
<asp:Content runat="server" id="contentDefault" ContentPlaceHolderId="ContentPlaceHolderPagina">
<div align="left">
    <table style="width: 100%; background-color: maroon">
            <tbody>
                <tr>
                    <td>
                        <span id="ctl00_ContentPlaceHolder1_lblTitulo" class="EtiquetaMedianoBlanco">                                    
                        <asp:Label ID="lblTituloPExt" runat="server" Text="Alta de Personal Interno" />
                        </span>
                    </td>
                </tr>
            </tbody>
     </table>
</div>
<cc1:TabContainer runat="server">
    <cc1:TabPanel runat="server" HeaderText="Titular">
        <ContentTemplate>
            <--!Code with Form Elements-->
            <asp:Button ID="btnAgregarNvo" runat="server" Text="Guardar" onclick="btnAgregarNvo_Click"/>
        </ContentTemplate>    
    </cc1:TabPanel> 
     <cc1:TabPanel runat="server" HeaderText="Familia">
        <ContentTemplate>
            <asp:HiddenField runat="server" id="hidFamiliares"></asp:HiddenField>
            <!--Code with Form Elements-->
             <asp:UpdatePanel runat="server" id="upFamiliares">
                <ContentTemplate>
                    <asp:Button ID="btnAgregarFamiliar" runat="server" Text="Agregar" onclick="btnAgregarFamiliar_Click"/>
                    <asp:Button ID="btnQuitarFamiliar" runat="server" Text="Quitar" onclick="btnQuitarFamiliar_Click"/>
                    <br/>
                    <asp:ListBox runat="server" ID="lbFamiliares"/>
                </ContentTemplate>
            </asp:UpdatePanel>   
        </ContentTemplate>    
    </cc1:TabPanel> 
</cc1:TabContainer> 

//------------------------------CODE BEHIND------------------------------------
private XmlDocument objXML;

protected void Page_Load(object sender, EventArgs e){
objXML = new XmlDocument();}

protected void btnAgregarFamiliar_Click(object sender, EventArgs e){
XmlElement xmlFamiliar = objXML.CreateElement("familiar");
AddAttribute("nombre",txtNombreF.Text,xmlFamiliar);
AddAttribute("apaterno",txtApF.Text,xmlFamiliar);
hidFamiliares.Value+=xmlFamiliar.InnerXml;}

private void AddAttribute(string name, string val, XmlElement parent){
XmlAttribute at = objXML.CreateAttribute(name);
at.Value = val;
parent.SetAttributeNode(at);}
4

2 回答 2

7

我不确定是什么原因造成的,您可能需要尝试一个更简单的方案来进行故障排除。

如果您的方法适用于Label控件,则始终可以使用不可见的控件而不是HiddenField?

<asp:Label runat="server" id="hidFamiliares" style="display:none;"/>
于 2012-01-18T20:07:57.013 回答
1

有点猜想。

但是从代码的外观来看,当您在 中提交按钮事件时UpdatePanel,它会重新加载面板,但不会重新加载您的值HiddenField,因此当UpdatePanel内容加载时,它仍然认为HiddenField为空。

将其包裹HiddenField起来UpdatePanel可能会起作用。或者您可以尝试将其包装在它自己的中,UpdatePanel然后UpdatePanel.Update()在您的按钮事件中调用,确保在面板上UpdateMode设置为。'Conditional'

于 2012-01-18T20:14:08.423 回答