【问题标题】:asp.net: How to get a button to affect the page contentsasp.net:如何获取影响页面内容的按钮
【发布时间】:2009-10-29 13:12:20
【问题描述】:

在 Page_Load 中,我用图像网格填充了一个 asp:Table。我有一个按钮,当按下它时,我希望它用不同的图像重新填充页面。

但是,当按钮被按下时,Page_Load 似乎再次被调用,然后是按钮指定的脚本。我认为我可以简单地在 Page_Load 期间检查的按钮脚本中设置一个变量,但这不起作用。

解决这个问题的最 asp.netish 方式是什么?我应该在 Page_Load 之外的其他地方填充我的表格,还是我的按钮应该做一些不同的事情?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    您的按钮事件在页面加载后被调用。因此,你应该把你的按钮代码放在那里。

    我不太确定您为什么要尝试将所有事件代码填充到 Page_Load 中,但最好将其分开。

    protected void Page_Load(object sender, EventArgs e)
    {
      MethodThatDynamicallyCreatesControls();
    }
    
    protected void MyImage_Click(object sender, EventArgs e)
    {
      MyImage.Property = newValue;
      MyImage2.Property = newValue2;
      PopulateTables(newValues);
    }
    

    不好

    protected void PageLoad(object sender, EventArgs e)
    {
      if (Page.IsPostBack)
      {
        //Check to see if "MyButton" is in the Request 
        // if it is, it's the button that was clicked
        if (Request["MyButton"])
        {
          MyImage.Property = newValue;
          MyImage2.Property = newValue;
          PopulateTables(newValues);
        }
      }
    }
    

    【讨论】:

    • 我不想将所有内容都放入 Page_Load,但我确实希望 Page_Load 对按钮按下做出反应(如果首先调用它就不能),或者将填充留给IsPostBack 允许我执行的按钮例程。谢谢
    • 根据forums.asp.net/t/1129248.aspx 动态添加到 ImageButtons 的 OnClick 事件只有在 Page_Load 期间添加时才会触发
    • 是的,您必须在每个页面请求时重新构建您的控制结构。这并不意味着您的 Page_Load 也应该执行您的所有逻辑。我会更新以澄清
    【解决方案2】:

    正如 rick 所说,这完全是理解回发的问题。

    page_load 每次刷新页面时都会触发。但是在许多情况下,您只希望在第一次加载页面时发生某些事情。在您的情况下,您希望加载默认图像。通过将页面加载的所有“一次性”事件放在

    if (!Page.IsPostback )
    {
    }
    

    它只会在页面第一次加载时触发。这就是您要加载的第一组图像。

    然后在您的按钮单击事件(触发回发)中,if 语句中的代码将不会再次执行。您可以在按钮的事件处理程序中加载第二组图像。

    【讨论】:

      【解决方案3】:

      你使用的那个按钮应该在你的代码后面调用一个方法,这样你就可以知道这个按钮被点击了,例如:

      protected void Important_ButtonClicked(Object sender, EventArgs e)
      {
          //do what I want to do
      }
      
      <asp:Button id="Button1"
             Text="MakeChanges"
             OnClick="Important_ButtonClicked" 
             runat="server"/>
      

      其实我明白你现在的问题是什么,似乎你只是在页面加载中设置了值,没有条件检查 在你的页面加载中,所以每次您有一个回发,它将页面刷新到原始状态,原因是每次您在页面上触发刷新(回发)时,都会调用 pageload 方法,因此您需要在页面加载中设置原始设置,但是有他们在这种情况下,如 if(!Page.Postback) 在您第一次访问此页面时触发。这意味着这是您的默认设置,if(Page.Postback) 是您始终真实的事情应该去的地方。例如:

      protected void Page_Load()
      {
         // this is where I want things to always happen whenever the page is loaded
         //for example, no matter what happens I want a certain image in the background
         if(!Page.Postback)
         {
           //set my values for the first and only time
         }
         else //hint Page.Postback
         {  
             //you can play with the page here to make necessary changes
             //but Button click method will still be invoke so thats where button click 
             //changes should be made
         }
      }
      

      【讨论】:

      • 我在 Page_Load 中设置的所有值似乎在每次页面刷新时都会被清除,所以看起来我必须每次都设置它们。
      【解决方案4】:

      页面重新加载时发生 PostBack。第一个页面加载,Page.IsPostBack 的值为 false。当事件发生时,Page.IsPostBack 的值为 true。 所以做这样的事情肯定会奏效

      void Page_Load()
      {
      if (!Page.IsPostBack)
      {
      //do your first time binding data
      }
      

      【讨论】:

        【解决方案5】:

        How to: Create Event Handlers in ASP.NET Web Pages

        编辑: 如果您在每次回发时重新绑定控件(即:DropDownList)数据,您的状态更改事件将不会正确触发。

        void Page_Load()
        {
            if (!IsPostBack)
            {
                //load your data
            }
        }
        

        【讨论】:

        • 实际上,如果他关闭了 EnableViewState(对于更大的数据控件,imo 应该这样做),他将需要在每次回发时重新绑定,以便触发他的事件。
        • 如果没有 ViewState,检测到控件更改的事件(如 dropdownlist.selectedindexchanged)将不起作用。我也喜欢在不需要时不使用它。 ASP.NET WebForms 建立在 ViewState 之上。如果你不使用它或不喜欢它,你应该使用 MVC。
        • @rick:现在我有一个页面,它使用动态创建的单选按钮,没有打开视图状态,它可以很好地触发事件。在 page_load 期间重新绑定对于没有视图状态的动态控件是完全可以接受的。
        • @JustLoren 超出了该问题的范围,但必须将动态控件重新添加到控件树以触发状态更改事件,而不是重新绑定。它们是有区别的。如果您重新添加它并将其(即 DropDownList)重新绑定到数据,您的状态更改事件将会出现问题。
        • @rick:“在 ASP.NET 中,这些值会在 Page_Load 之前的一个称为“ProcessPostData”的阶段中自动写回控件的属性。...动态控件通常在 Page_Load 中创建。因此在"这意味着您可以重新添加重新绑定动态 DropDownList,它会正常运行。 tek-tips.com/faqs.cfm?fid=5550
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2012-10-12
        • 1970-01-01
        • 2021-05-21
        相关资源
        最近更新 更多