回发

时间:2016-03-31 06:39:41

标签: asp.net postback detailsview formview

在我的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;

0 个答案:

没有答案