回发后 ASP.NET 会丢失表单中的数据 - 转发器内的更新面板中的中继器
本文关键字:转发器 更新 中继器 数据 NET ASP 表单 | 更新日期: 2023-09-27 18:34:18
我有一个 ASP.NET 的Web表单,其中我有几个复选框等来制作SearchCriteria对象。当我单击提交按钮时,我要求中继器1根据搜索条件显示一些记录。在中继器1内部,我有用户控制更新面板和另一个中继器(儿童中继器(。
我的问题:当我在回发后单击按钮上的发送时,我丢失了表单中的所有数据(例如,选中了复选框(。页面正在加载默认值,但在我的代码中,我仅在当(!IsPostBack(。当然,我在.aspx中有"EnableViewState=true",我也尝试在会话中保存表单中的数据,但它也不起作用(默认值重写此设置(。
当我只有一个中继器(repeater1(时,回发后的表单有我放在上面的所有数据,所以我认为 updatepanel 中存在一些问题,但我不知道确切在哪里。你能解释一下为什么我的表单在页面重新加载后丢失数据吗?我看不出任何错误..
底部是我的文件,但我有 n 层架构,所以......我只放了来自视图/BLL的必要文件(DAL和SQL连接工作正常(这里有一个屏幕它的外观:屏幕
显示协议.aspx(它包含控件和父转发器(:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
<table style="border: 1px solid #0000FF; width: 1250px">
<tr style="background-color: #3d6db0; color: #000000; font-weight: bold;">
<td style="width: 150px;">Numer</td>
<td style="width: 150px;">Przedmiot umowy</td>
<td style="width: 150px;">Odbiorca</td>
<td style="width: 150px;">Dostawca</td>
<td style="width: 150px;">Rodzaj umowy</td>
<td style="width: 150px;">Charakter umowy</td>
<td style="width: 150px;">Status wypożyczenia</td>
<td style="width: 150px;">Data podpisania</td>
<td style="width: 150px;">Status</td>
</tr>
</HeaderTemplate>
<itemtemplate>
<uc1:FilesRepeaterControl runat="server" id="FilesRepeaterControl" />
</itemtemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
展会协议.aspx.cs:
AgreementsSearchCriteria AgreementSearchCriteriaObj = new AgreementsSearchCriteria();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Controller.ReadDostawcy();
Controller.ReadOdbiorcy();
Controller.ReadPracownikOdp();
}
Controller.ReadAllAgreements();
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Agreement umowa = e.Item.DataItem as Agreement;
BazaUmow.Controls.FilesRepeaterControl test = e.Item.FindControl("FilesRepeaterControl") as FilesRepeaterControl;
test.umowa = umowa;
}
}
protected void szukaj_Click(object sender, EventArgs e)
{
if (IsValid == true)
{
AddNaviPoint();
Controller.ReadAllAgreements();
}
}
public AgreementSearchCollection BindUmowyResults
{
set
{
Repeater1.DataSource = value;
Repeater1.DataBind();
}
}
FilesRepeaterControl.ascx <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FilesRepeaterControl.ascx.cs" inherits="BazaUmow.Controls.FilesRepeaterControl" %>
<tr>
<td style="width: 150px">
<asp:Button ID="btnRozwin" runat="server" Text="+" OnClick="btnRozwin_Click" />
<asp:LinkButton ID="lbl_numerUmowy" runat="server" OnClick="lbl_numerUmowy_Click"></asp:LinkButton>
</td>
<td style="width: 150px">
<asp:Label ID="lbl_przedmiotUmowy" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_odbiorca" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_dostawca" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_rodzajUmowy" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_charakterUmowy" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_statusWypozyczenia" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_dataPodpisania" runat="server" /></td>
<td style="width: 150px">
<asp:Label ID="lbl_statusUmowy" runat="server" /></td>
</tr>
<tr>
<td>
<asp:UpdatePanel ID="UpdatePanelFilesInfo" runat="server">
<ContentTemplate>
<asp:Repeater ID="filesRptr" runat="server" OnItemDataBound="filesRptr_ItemDataBound">
<HeaderTemplate>
<table style=" width:170px">
<tr style="font-weight: bold;">
<td style="width:170px;">Pliki umowy</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="lblPlikUmowy" runat="server" OnCommand="lblPlikUmowy_Command"></asp:LinkButton></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:Repeater ID="aneksyRptr" runat="server" OnItemDataBound="aneksyRptr_ItemDataBound">
<HeaderTemplate>
<table style=" width:170px">
<tr style="font-weight: bold;">
<td style="width:170px;">Aneksy do umowy</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="lblAneksUmowy" runat="server" OnCommand="lblAneksUmowy_Command"></asp:LinkButton></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr>
FilesRepeaterControl.ascx.cs(这里我们将数据添加到父中继器,并在单击按钮btnRozwin时填充两个子中继器( public Agreement umowa { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
lbl_numerUmowy.Text = umowa.numer_umowy.ToString();
lbl_przedmiotUmowy.Text = umowa.przedmiot_umowy.ToString();
lbl_odbiorca.Text = umowa.odbiorca_tekst.ToString();
lbl_dostawca.Text = umowa.dostawca_tekst.ToString();
lbl_rodzajUmowy.Text = umowa.rodzaj_umowy_tekst.ToString();
lbl_charakterUmowy.Text = umowa.charakter_umowy_tekst.ToString();
lbl_statusWypozyczenia.Text = umowa.status_wypozyczenia_tekst.ToString();
lbl_dataPodpisania.Text = umowa.data_podpisania.ToString("yyyy-MM-dd");
lbl_statusUmowy.Text = umowa.status_umowy.ToString();
}
protected void filesRptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Plik plik = e.Item.DataItem as Plik;
LinkButton lblPlikUmowy = e.Item.FindControl("lblPlikUmowy") as LinkButton;
lblPlikUmowy.Text = plik.nazwa_pliku.ToString();
lblPlikUmowy.CommandArgument = plik.guid + plik.rozszerzenie;
}
}
protected void aneksyRptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Plik plik = e.Item.DataItem as Plik;
LinkButton lblAneksUmowy = e.Item.FindControl("lblAneksUmowy") as LinkButton;
lblAneksUmowy.Text = plik.nazwa_pliku.ToString();
lblAneksUmowy.CommandArgument = plik.guid + plik.rozszerzenie;
}
}
protected void btnRozwin_Click(object sender, EventArgs e)
{
if (btnRozwin.Text == "+")
{
filesRptr.Visible = true;
aneksyRptr.Visible = true;
filesRptr.DataSource = Controller.ReadFilesByAgreement(Convert.ToInt32(lbl_numerUmowy.Text), 1);
filesRptr.DataBind();
aneksyRptr.DataSource = Controller.ReadFilesByAgreement(Convert.ToInt32(lbl_numerUmowy.Text), 2);
aneksyRptr.DataBind();
btnRozwin.Text = "-";
}
else
{
filesRptr.Visible = false;
aneksyRptr.Visible = false;
btnRozwin.Text = "+";
}
}
protected void lbl_numerUmowy_Click(object sender, EventArgs e)
{
string numer_umowy = ((LinkButton)sender).Text;
Page.Response.Redirect("~/SeeAgreementData.aspx?numer=" + numer_umowy + "&email=" + Request.QueryString["email"]);
}
}
这是因为当您回发更新面板时,它会刷新页面的一部分(周围有更新面板(,因此该面板上的所有数据都将丢失,您可以在ViewState中保存所需的所有数据
protected void UpdatePanelClick_OnClick(object sender, EventArgs e)
{
List<int> checkedIds = new List<int>();
//working with grid saving ids on list
ViewState["saveUpdatePanelData"] = checkedIds;
}
比回发后的页面加载,您可以获取此数据并初始化
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["saveUpdatePanelData"]!= null)
{
checkedIds = ViewState["saveUpdatePanelData"] as List<int>;
}
}
这就是视图状态的工作方式。