刷新时,ASP.NET Web表单上的回发行为很奇怪

时间:2017-06-07 10:04:05

标签: asp.net webforms refresh postback

在ASP.NET Web表单中,我有两个按钮控件,我遇到了一个奇怪的场景。 我有btnOpenAddRoleModal和btn2。当我点击btnOpenAddRoleModal时,btnAddGlobalRoles变为可见,然后我点击执行某些功能的btnAddGlobalRoles。

现在,当我按F5刷新页面,并且因为ASP.NET在刷新时再次回发页面,它会像往常一样回复帖子。

我的问题是它运行btnOpenAddRoleModal的click事件处理程序而不是btnAddGlobalRoles,而我点击的最后一个按钮是btnAddGlobalRoles。

任何人都知道为什么会出现这种情况?

aspx页面

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/MainTheme.Master" AutoEventWireup="true" CodeBehind="GlobalRoles.aspx.cs" Inherits="OPT.GlobalRoles" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <header style="overflow: auto;">
        <h1 class="zs-left">Global Roles</h1>
        <div class="zs-right">
            <asp:Button ID="btnOpenAddRoleModal" runat="server" Text="Add User" CssClass="zs-button zs-button-action" OnClick="btnOpenAddRoleModal_Click" OnClientClick="return IncreasePostBackControlValue();" />
        </div>
    </header>

    <section class="page-2cols" style="position: relative;">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <h2 class="zs-inner-title">Roles</h2>
                <p class="zs-search-button">
                    <span class="zs-input-icon zs-icon-search">
                        <asp:Label ID="lblSearchText" runat="server" Text="Search Roles " Style="font-weight: 700"></asp:Label>
                        <asp:TextBox ID="txtSearchText" runat="server" CssClass="zs-input" placehoder="Enter key words to search" AutoPostBack="True" OnTextChanged="txtSearchText_TextChanged"></asp:TextBox>
                    </span>
                </p>
                <p>
                    <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label></p>
                <p>
                    <asp:Label ID="lblNoResultsMessage" runat="server" Text="No results found" Visible="false"></asp:Label></p>
                <p>
                    <asp:GridView ID="gvGlobalRoles" runat="server" AutoGenerateColumns="False" OnRowDeleting="gvGlobalRoles_RowDeleting" CssClass="zs-data-table">
                        <Columns>
                            <asp:BoundField DataField="Serial" HeaderText="Sr. No." />
                            <asp:BoundField DataField="EmployeeName" HeaderText="Employee Name" />
                            <asp:BoundField DataField="RoleName" HeaderText="Role" />
                            <asp:TemplateField HeaderText="Action">
                                <ItemTemplate>
                                    <span class="zs-icon zs-icon-delete"></span>
                                    <asp:LinkButton Text="Delete" CommandName="Delete" runat="server" />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </p>

                <asp:Panel ID="pnlOverlay" CssClass="zs-overlay" Visible="false" runat="server"></asp:Panel>
                <asp:Panel ID="pnlModal" Visible="false" CssClass="zs-modal" Style="display: inline-block; position: fixed; top: 50%; left: 50%; margin-top: 0px; margin-left: 0px; transform: translate(-50%, -50%);" runat="server">
                    <header>
                        <span><% =ModalTitle %></span>
                        <asp:LinkButton ID="lbCloseModal" runat="server" CssClass="zs-icon zs-icon-close zs-icon-large" OnClick="lbCloseModal_Click"></asp:LinkButton>
                    </header>
                    <section>
                        <p>
                            <asp:Label ID="lblModalMessage" runat="server" Text=""></asp:Label></p>

                        <asp:Panel ID="pnlDeleteListItem" runat="server" Visible="false">
                            You have selected to delete a role. Press OK to continue or Cancel to abort.
                        </asp:Panel>

                        <asp:Panel ID="pnlAddEditListItem" runat="server" Visible="false">
                            <p>
                                <asp:Label ID="lblEmployeeToAdd" runat="server" Text="Employee Email"></asp:Label><br />
                                <asp:TextBox ID="txtEmployeeToAdd" runat="server" CssClass="zs-input"></asp:TextBox>
                            </p>
                            <p>
                                <asp:Label ID="lblRoleToAdd" runat="server" Text="Role"></asp:Label><br />
                                <asp:DropDownList ID="ddlRoleToAdd" runat="server" CssClass="zs-input"></asp:DropDownList>
                            </p>
                        </asp:Panel>

                    </section>
                    <footer>
                        <asp:LinkButton ID="lbCancelModal" runat="server" OnClick="lbCancelModal_Click">Cancel</asp:LinkButton>
                        <asp:Button ID="btnAddGlobalRoles" runat="server" Text="Add" CssClass="zs-button zs-button-action" OnClick="btnAddGlobalRoles_Click" OnClientClick="return IncreasePostBackControlValue();" Visible="false" />
                        <asp:Button ID="btnDeleteGlobalRole" runat="server" CssClass="zs-button zs-button-action" Text="OK" OnClick="btnDeleteGlobalRole_Click" OnClientClick="return IncreasePostBackControlValue();" Visible="false" />
                    </footer>
                </asp:Panel>
                <asp:HiddenField ID="hfPostBackControl" runat="server" ClientIDMode="Static" />
                <script>
                    //$(document).on("click", "button,input[type='submit'],input[type='button']", function () {
                    //    $("#hfPostBackControl").val($("#hfPostBackControl").val() == "" ? 1 : Number($("#hfPostBackControl").val()) + 1);
                    //});

                    function IncreasePostBackControlValue() {
                        $("#hfPostBackControl").val($("#hfPostBackControl").val() == "" ? 1 : Number($("#hfPostBackControl").val()) + 1);
                        return true;
                    }
                </script>
            </ContentTemplate>
        </asp:UpdatePanel>
    </section>
</asp:Content>

aspx.cs页面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using OPT.Models;

namespace OPT
{
    public partial class GlobalRoles : System.Web.UI.Page
    {
        BAL bal = new BAL();
        string message = "";
        int messageStateID;
        DataTable dtRoles;
        DataTable dtGlobalEmployeeRoles;
        GlobalRole globalRoleToDelete;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LoadRoleDropDown();
                LoadGlobalRolesFromDatabase();
                Session["sPostBackValue"] = 0;
            }

            Generic.HideControls(AllMessageControls);
        }

        protected void Page_PreInit(object sender, EventArgs e)
        {
            Session["CurrentPage"] = ePage.GlobalRoles;
        }

        protected void Page_LoadComplete(object sender, EventArgs e)
        {
            if (!Pages.ShowGlobalRoles())
            {
                Generic.RediretToMesagePage("Unauthorized user");
            }

            if (gvGlobalRoles.Rows.Count > 0)
            {
                gvGlobalRoles.HeaderRow.TableSection = TableRowSection.TableHeader;
                lblNoResultsMessage.Visible = false;
            }
            else
            {
                lblNoResultsMessage.Visible = true;
            }
        }

        void LoadGlobalRolesFromDatabase()
        {
            dtGlobalEmployeeRoles = bal.GetGlobalEmployeeRoles(txtSearchText.Text, ref message, ref messageStateID);
            Session["GlobalEmployeeRoles"] = dtGlobalEmployeeRoles;
            gvGlobalRoles.DataSource = Session["GlobalEmployeeRoles"] as DataTable;
            gvGlobalRoles.DataBind();
        }

        void LoadRoleDropDown()
        {
            dtRoles = bal.GetGlobalRoles(ref message, ref messageStateID);
            Generic.PopulateDataTableInDropDown(ddlRoleToAdd, dtRoles, "ID", "Name", "Please select");
        }

        protected void gvGlobalRoles_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int rowIndex = e.RowIndex;
            globalRoleToDelete = new GlobalRole();

            dtGlobalEmployeeRoles = Session["GlobalEmployeeRoles"] as DataTable;
            globalRoleToDelete.ID = Convert.ToInt32(dtGlobalEmployeeRoles.Rows[rowIndex]["ID"].ToString());

            Session["CurrentGlobalRole"] = globalRoleToDelete;

            ModalTitle = "Delete Role";
            Generic.ShowControls(modalDeleteControls);
        }

        protected void btnAddGlobalRoles_Click(object sender, EventArgs e)
        {
            if (Generic.IsRefresh(hfPostBackControl)) { return; }

            Employee employee = new Employee();
            Role role = new Role();

            employee.EmailID = txtEmployeeToAdd.Text;
            role.ID = Convert.ToInt32(ddlRoleToAdd.SelectedValue);

            bal.CreateGlobalEmployeeRole(employee, role, ref message, ref messageStateID);
            if (messageStateID == 1)
            {
                Generic.HideControls(modalAllControls);
                Generic.ShowMessage(lblMessage, message, messageStateID);
            }
            else
            {
                ModalTitle = eModalTitle.EditProject;
                Generic.ShowMessage(lblModalMessage, message, messageStateID);
            }
            LoadGlobalRolesFromDatabase();
        }

        protected void btnDeleteGlobalRole_Click(object sender, EventArgs e)
        {
            if (Generic.IsRefresh(hfPostBackControl)) { return; }

            globalRoleToDelete = Session["CurrentGlobalRole"] as GlobalRole;
            bal.DeleteGlobalEmployeeRole(globalRoleToDelete, ref message, ref messageStateID);
            if (messageStateID == 1)
            {
                Generic.HideControls(modalAllControls);
                Generic.ShowMessage(lblMessage, message, messageStateID);
            }
            else
            {
                ModalTitle = eModalTitle.EditProject;
                Generic.ShowMessage(lblModalMessage, message, messageStateID);
            }
            LoadGlobalRolesFromDatabase();
            Generic.HideControls(modalDeleteControls);
        }

        protected void lbCloseModal_Click(object sender, EventArgs e)
        {
            Generic.HideControls(modalAllControls);
        }


        protected void lbCancelModal_Click(object sender, EventArgs e)
        {
            Generic.HideControls(modalAllControls);
        }

        protected void btnOpenAddRoleModal_Click(object sender, EventArgs e)
        {
            if (Generic.IsRefresh(hfPostBackControl)) { return; }

            ModalTitle = "Add Role";
            Generic.ClearControlValuesInContainer(pnlAddEditListItem);
            Generic.ShowControls(modalAddControls);
        }

        protected void txtSearchText_TextChanged(object sender, EventArgs e)
        {
            LoadGlobalRolesFromDatabase();
        }
        private string _ModalTitle;

        public string ModalTitle
        {
            get { return _ModalTitle; }
            set { _ModalTitle = value; }
        }

        protected List<Control> modalAllControls
        {
            get
            {
                List<Control> controls = new List<Control>();
                controls.AddRange(modalGenericControls);
                controls.AddRange(modalAddControls);
                controls.AddRange(modalDeleteControls);

                return controls;
            }
        }

        protected List<Control> modalGenericControls
        {
            get
            {
                return new List<Control>{
                    pnlOverlay as Control,
                    pnlModal as Control
                };
            }
        }

        protected List<Control> modalDeleteControls
        {
            get
            {
                List<Control> controls = new List<Control>{
                    pnlDeleteListItem as Control,
                    btnDeleteGlobalRole as Control
                };

                controls.AddRange(this.modalGenericControls);
                return controls;
            }
        }

        protected List<Control> modalAddControls
        {
            get
            {
                List<Control> controls = new List<Control>{
                    pnlAddEditListItem as Control,
                    btnAddGlobalRoles as Control
                };
                controls.AddRange(this.modalGenericControls);

                return controls;
            }
        }

        protected List<Control> AllMessageControls
        {
            get
            {
                List<Control> messageControls = new List<Control>{
                    lblMessage as Control,
                    lblModalMessage as Control
                };

                return messageControls;
            }
        }
    }
}

这里很少有支持方法

    public static bool IsRefresh(HiddenField hfPostBackControl)
    {
        int sPostBackValue = HttpContext.Current.Session["sPostBackValue"] == null ? 0 : Convert.ToInt32(HttpContext.Current.Session["sPostBackValue"]);
        int hPostBackValue = string.IsNullOrEmpty(hfPostBackControl.Value) ? 0 : Convert.ToInt32(hfPostBackControl.Value);

        HttpContext.Current.Session["sPostBackValue"] = hPostBackValue;

        return sPostBackValue == hPostBackValue;            
    }

    /// <summary>
    /// This method can be used for displaying pop ups after any action. One needs to pass the controls as parameter that need to shown on any event.
    /// </summary>
    /// <param name="controls">List of controls that need to be displyed as pop-up</param>
    public static void ShowControls(List<Control> controls)
    {
        foreach (Control c in controls)
        {
            c.Visible = true;
        }
    }

    /// <summary>
    /// This method can be used for hiding pop ups being displayed. One needs to pass the controls as parameter that need to hidden on any event.
    /// </summary>
    /// <param name="controls">List of controls that need to be hidden</param>
    public static void HideControls(List<Control> controls)
    {
        foreach (Control c in controls)
        {
            c.Visible = false;
        }
    }

    public static void ShowMessage(Label lblMessage, string message, int messageStateID)
    {
        lblMessage.Text = message;
        lblMessage.CssClass = messageStateID == 1 ? "zs-message zs-success" : "zs-message zs-error";
        lblMessage.Visible = true;
    }

0 个答案:

没有答案