asp.net UpdatePanel后中继器丢失数据

jm81lzqq  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(111)

从DropDownList中选择数据后,我将其ID保存在ViewState中,但在第二个控制页面中,此数据(ProjectID)返回0,而不是保存的ID。rowRepeater位于UpdatePanel中,但如果我重新加载页面,则会正确传递ID。有人能帮帮我吗?

<asp:Repeater ID="m_RowRepeater" runat="server">
   
 <%--Riferimento alla riga contenente i giorni del mese--%>
    <HeaderTemplate>
            <tr>
                <td colspan="3">
                    <%--Header row has special "ProjectID"  --%>
                    <cdgWebCtrl:FerieRichiestaMonthRow ID="FerieRichiestaMonthRowHeader" runat="server" ProjectID="-1" ProjectTitle="Commessa (ID)" ProjectLeader="Capo Progetto" />
                </td>
            </tr>
    </HeaderTemplate>
  <%--Fa riferimento ad un progetto--%>
    <ItemTemplate>
            <tr>
                <td colspan="3">
                    <cdgWebCtrl:FerieRichiestaMonthRow runat="server" 
                        ProjectID='<%# DataBinder.Eval(Container.DataItem, "idPrj") %>'
                        ProjectTitle='<%# DataBinder.Eval(Container.DataItem, "UserLabelTitle") %>'
                        ProjectLeader='<%# DataBinder.Eval(Container.DataItem, "CapoPrj") %>'
                       />
                </td>
            </tr>
    </ItemTemplate>
   
</asp:Repeater>

字符串
代码:

if (!IsPostBack)
{
    ViewState["project_id"] = this.ProjectID;
    ApplyRowModeValue();
}
else if (ProjectID == 0 && ViewState["project_id"] != null)
{
    this.ProjectID = (int)ViewState["project_id"];
}

rvpgvaaj

rvpgvaaj1#

请记住,视图状态仅适用于当前网页。如果您跳转或导航到不同的页面?则视图状态将丢失。
当移动或导航到其他页面时,是否需要保留值?
然后,我建议使用session()将该信息传递到下一个页面。
但是,如果这些值没有正确地保存在当前页上,会发生什么情况?那么在大多数情况下,页面加载事件通常就是问题所在。每次发生回发时,都会触发页面加载事件,即使是简单的按钮单击也是如此。且页面加载器事件在按钮单击事件代码存根之前触发。
所以,通常情况下,我们在页面加载事件中有一些简单的设置代码。(按照本例,设置控件或将数据加载到网格视图或重复器中)。因此,在每次回发时,如果该代码运行以重新加载中继器,则值可能会丢失,因为中继器“再次”被重新加载。
因此,在大多数情况下,页面加载事件将需要在If not IsPostBack(Postback = false)的测试中包含“所有重要”代码存根。
例如:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadCityCbo();
    }

    void LoadCityCbo()
    {
        SqlCommand cmd = 
            new SqlCommand("Select City FROM City ORDER BY City");
        General.Cbo(cboCity, cmd, "", "City", "Select City");
    }

字符串
因此,在上面的页面加载中,我们正在填写一个组合框。然而,由于我们将代码 Package 在if(!IsPostBack),则该代码将仅在第一个页面加载时运行,而不是在每次单击其他按钮后回发。
在一天结束的时候?
Viewstate为“每页”,如果导航到另一页,则会丢失。因此,使用session()将是一个更好的选择,因为session()是“针对每个用户”的,并且该信息在网页之间传播,并在页面之间“持久”。
因此,视图状态不能用于将值传递到另一个网页,但session()可以。

相关问题