使用AJAX UpdatePanel“回发”时,HiddenField Value属性返回空

时间:2012-01-18 18:02:54

标签: c# .net postback hiddenfield

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

基本上我有一个用AJAXControlToolKit TabContainer Control分为两页的页面。第一种形式是用户主数据,而第二种形式的形式是用户填写表格的次数,因为它用于存储家庭成员。因此,过程是填充家庭成员数据,单击按钮并将其存储在HiddenField.Value中,填充第二个家庭成员数据并再次单击以添加新的家庭成员并连接到HiddenField.Value ...但是我意识到在第一次单击Load Page方法后,HiddenField.Value再次为空......

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

正如我刚才所说,如果改为使用HiddenField.Value,我使用Label.Text,Everything Works ......

<%@ 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);}

2 个答案:

答案 0 :(得分:7)

我不确定导致它的原因,您可能需要尝试更简单的方案进行故障排除。

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

<asp:Label runat="server" id="hidFamiliares" style="display:none;"/>

答案 1 :(得分:1)

有点猜测。

但是根据代码的外观,当您在UpdatePanel中提交按钮事件时,它会重新加载面板,但它不会重新加载HiddenField的值,所以当{ {1}}内容加载后,它仍会将UpdatePanel视为空。

HiddenField包装在同一HiddenField中可能会有效。或者您可以尝试将其包装在自己的UpdatePanel中,然后在按钮事件中调用UpdatePanel,确保面板上的UpdatePanel.Update()设置为UpdateMode