【问题标题】:Losing value when clicking on button in ascx control that is rendered in asp:Repeater单击 ascx 控件中在 ascx 中呈现的按钮时失去价值:Repeater
【发布时间】:2014-03-18 11:25:14
【问题描述】:

我创建了一个asp:Repeater,并用.ascx 控件填充:

protected void Page_Load(object sender, EventArgs e)
{
    Repeater1.DataSource = listOfData;
    Repeater1.DataBind();            
}

在我的页面上:

<uc:Product runat="server"                                             
    ImportantData='<% #Eval("ImportantData") %>'                                               
    id="DetailPanel1" />

Product.ascx.cs里面我有:

public int ImportantData{ get; set; }
protected void Page_Load(object sender, EventArgs e)
{

}

Product.ascx 我有:

<asp:ImageButton ID="btn_Ok" runat="server" 
     onclick="btn_Ok_Click"  
     ImageUrl="~/image.png" />

问题是当我点击图片按钮时出现错误:

A critical error has occurred. Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page...

我已尝试将第一个代码更改为:

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        Repeater1.DataSource = listOfData;
        Repeater1.DataBind();            
    }
    // Repeater1.DataBind(); // and tried to put DataBind() here
}

但是当我点击图片按钮时,ImportantData 是空的。
我在这里做错了什么?

【问题讨论】:

  • ImportantData 是从哪里来的?你确定绑定列表中的对象有它吗?
  • 你试过设置 EnableEventValidation="false" 吗?
  • “我用 .ascx 控件填充”让我怀疑。 listOfData 包含什么,它与 有什么关系?
  • 您能否就建议的解决方案或有关您的具体问题的更多信息提供一些反馈?

标签: c# asp.net repeater


【解决方案1】:

PageLoad 在您的回发事件之前发生,将您的事件更改为 PreRender:

protected void Page_PreRender(object sender, EventArgs e)
{
    Repeater1.DataSource = listOfData;
    Repeater1.DataBind();            
}

这将在回发后绑定您的转发器并保持您的回发值。

编辑:

Here's a good picture showing the entire WebForms page lifecycle:

如你所见

ProcessPostData 事件被调用之后 Load 事件。

所以你想在 PostData 被处理后绑定你的Repeater

这可以在PreRender上完成

【讨论】:

    【解决方案2】:

    问题不在于您在错误的位置调用数据绑定,而很可能是用户控件没有正确地将数据保存在视图状态中。看起来您正在使用自定义控件。如果是这种情况,您可以做的是在您的用户控件上创建一个从视图状态读取的属性。这是一个例子:

    Public Property ImportantData() As Int32
        Get
            Return ViewState("_ImportantData")
        End Get
        Set(ByVal value As Int32)
            ViewState("_ImportantData") = value
        End Set
    End Property
    

    这将使您的数据得以保留,并在回发时提供必要的数据。

    这样做是正确的,因此它只在初始加载时加载。

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {
            Repeater1.DataSource = listOfData;
            Repeater1.DataBind();            
        }
        // Repeater1.DataBind(); // and tried to put DataBind() here
    }
    

    【讨论】:

    • “问题不在于你在错误的地方调用数据绑定”
    • 他对视图状态一无所知。我从经验中推断出他正在使用自定义控件,然后他可以确保它保持他的属性,这是他的问题。如果没有视图状态,那么这实际上需要在 init 阶段完成(作为编写了一个完全动态的应用程序的人)。如果在此之后绑定,则在需要引发事件时缺少该值。事实上,如果你在此之后重新绑定,那么你最终会取消用户想要触发的事件。
    • 如果他的问题是视图状态问题(我相信是),在预渲染时触发将为时已晚,并且该值仍然会丢失。我认为您误读了他的问题,问题是缺少值,而不是事件没有触发。
    • 因此,尽管我给出了一个有效的答案,但您似乎并不了解页面生命周期。你决定对我投反对票。恭喜!
    • 如果他实施了您的解决方案,它仍然无法正常工作。我已经解释了原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多