在我的aspx文件中,我有几个标签,一个FormView和一个DetailsView。 在PreRender期间,我手动设置标签的文本(我的应用程序支持多种语言,标签根据userprofile设置)。此外,FormView和DetaisView中的标签文本在PreRender期间设置。我使用.FindControl方法来获取对实际控件的引用。 最后,在PreRender期间,我创建了各种验证器控件并手动将它们添加到FormView和DetailsView。
当我的页面首次加载上述所有作品时,就好了。
当我进行回发时,无论是按下FormView或DetailsView内的按钮还是更改下拉框的选择,都会触发PreRender页面;正在设置文本并创建和添加验证器。
现在它来了;在回发之后,只要页面在浏览器中刷新,标签就会显示其默认文本(在aspx文件中设置),我的验证器控件就会消失。
有没有人经历过这种情况,导致这种行为的原因是什么?更重要的是,我该如何解决这个问题?
编辑 - 添加了重现的示例代码
我刚刚制作了一个非常干净的示例项目来重现这种行为。 这是aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FormView ID="fvwCalculateHeartRateZones" runat="server" DataSourceID="odsHeartRateZones" DefaultMode="Insert">
<InsertItemTemplate>
<asp:Label ID="lblHFMax" runat="server" SkinID="LabelHeader4" Text="_Max"></asp:Label>
<asp:TextBox ID="txtHFMax" runat="server" SkinID="TextBoxDefault" Text='<%# Bind("iHFMax") %>' Width="80px"></asp:TextBox>
<asp:Button ID="btnHFZCalculate" runat="server" CommandName="Insert" SkinID="ButtonDefault" Text="_Calculate" ValidationGroup="HFZCalculate" Width="100" />
</InsertItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="odsHeartRateZones" runat="server"
TypeName="HeartRateZones"
DataObjectTypeName="HeartRateZones"
InsertMethod="InsertByCalculation" >
</asp:ObjectDataSource>
</div>
</form>
</body>
</html>
这是aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Page_PreRender(object sender, EventArgs e)
{
Label lblHFMax = (Label)fvwCalculateHeartRateZones.FindControl("lblHFMax");
lblHFMax.Text = "MaxP";
Button btnHFZCalculate = (Button)fvwCalculateHeartRateZones.FindControl("btnHFZCalculate");
btnHFZCalculate.Text = "Calculate";
}
}
最后是ObjectDataSource
使用的类using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
public class HeartRateZones
{
public int iHFMax { get; set; }
public HeartRateZones()
{
//
// Add constructor logic here
//
}
public static int InsertByCalculation(HeartRateZones oAEntry)
{
return 0;
}
}
所有非常基本和简单。当您运行页面时,您将看到标签的标题,按钮设置为&#34; MaxP&#34;和&#34;计算。&#34;
在按下“计算”按钮之前,请确保插入数字值(例如0)。然后按计算按钮。您将看到标签的标题和按钮返回其默认值&#34; _Max&#34;和&#34; _Calculate&#34;