【问题标题】:ASP.NET Dynamic link buttonASP.NET 动态链接按钮
【发布时间】:2009-06-15 09:14:04
【问题描述】:

我什至在 page_init 期间创建了一个动态链接,并将 onclick 绑定到链接按钮。点击动态链接可以回发,但它不会引发 onclick 事件(在调试模式下点击 onclick 事件)。页面回发并显示空白页面而不触发事件。请任何人都可以告诉我在下面的代码中做错了什么。我正在使用 vs2005(ASp.Net 2.0)。请查看我动态创建链接按钮的第一个 switch 案例。

public partial class ChooseRole : System.Web.UI.Page
{
    public Int32 ismId;
    public DataTable UserCredentialsDT;
    public DataTable dsUserDetails = null;
    public String strPage = "";
    protected System.Web.UI.WebControls.LinkButton lnkAdmin;

    //protected System.Web.UI.WebControls.PlaceHolder PlaceHolderRoles;

    protected void Page_Init(object sender, EventArgs e)
    {
        if (Session[PresentationConstant.USERCREDENTIALS] != null)
        {
            dsUserDetails = (DataTable)Session[PresentationConstant.USERCREDENTIALS];
            ismId = Convert.ToInt32(dsUserDetails.Rows[0][0].ToString());
        }

        Helper.validateRoleAuthentication(PresentationConstant.PAGE_CHOOSEROLE);
        if (!IsPostBack)
        {            
            if (Session[PresentationConstant.USERCREDENTIALS] != null)
            {
                UserCredentialsDT = (DataTable)Session[PresentationConstant.USERCREDENTIALS];

                //Sorting the roles
                DataView v = UserCredentialsDT.DefaultView;
                v.Sort = "roleName";
                UserCredentialsDT = v.ToTable();

                Int32 ismId = Convert.ToInt32(UserCredentialsDT.Rows[0][0].ToString());

                for (int i = 0; i < UserCredentialsDT.Rows.Count; i++)
                {

                    switch (Convert.ToInt32(UserCredentialsDT.Rows[i]["RoleId"]))
                    {
                        case (int)Helper.UserRole.Administrator:

                            //Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                             //LinkButton link = new LinkButton();
                             //{
                             //    link.Text = "Test< /br>";
                             //    link.ID = "TestButton";
                             //    link.Click += new EventHandler(TestClicked);


                             //}
                             //PlaceHolderRoles.Controls.Add(link);
                            lnkAdmin = new LinkButton();
                            lnkAdmin.EnableViewState = true;
                            lnkAdmin.Text = "Administrator" + "<br />";
                            lnkAdmin.ID = "lnkAdmin";

                            this.lnkAdmin.Click += new EventHandler(this.lnkAdmin_Click);
                            this.PlaceHolderRoles.Controls.Add(lnkAdmin);


                            //lnkAdmin.Visible = true;

                            break;


                        case (int)Helper.UserRole.KeyHolder:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            String strPage;
                            LinkButton lnkSM = new LinkButton();
                            lnkSM.EnableViewState = true;
                            lnkSM.Text = "Manager / Key Holder" + "<br />";
                            lnkSM.ID = "lnkSM" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkSM);
                            lnkSM.Visible = true;
                            strPage = GetStoresForStoreManager_Table(ismId);
                            if (!String.IsNullOrEmpty(strPage))
                            {
                                lnkSM.PostBackUrl = strPage;
                            }
                            break;

                        case (int)Helper.UserRole.DistrictManager:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkDM = new LinkButton();
                            lnkDM.EnableViewState = true;
                            lnkDM.Text = "District Manager" + "<br />";
                            lnkDM.ID = "lnkDM" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkDM);
                            lnkDM.Visible = true;
                            lnkDM.PostBackUrl = PresentationConstant.ASPX_DMREPORTS;
                            break;

                        case (int)Helper.UserRole.ARD:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkARD = new LinkButton();
                            lnkARD.EnableViewState = true;
                            lnkARD.Text = "ARD" + "<br />";
                            lnkARD.ID = "lnkARD" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkARD);
                            lnkARD.Visible = true;
                            lnkARD.PostBackUrl = PresentationConstant.ASPX_ARDREPORTS;
                            break;

                        case (int)Helper.UserRole.TeamAdvisor:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkTeamAdvisor = new LinkButton();
                            lnkTeamAdvisor.EnableViewState = true;
                            lnkTeamAdvisor.Text = "Team Advisor" + "<br />";
                            lnkTeamAdvisor.ID = "lnkTeamAdvisor" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkTeamAdvisor);
                            lnkTeamAdvisor.Visible = true;
                            lnkTeamAdvisor.PostBackUrl = PresentationConstant.ASPX_DMREPORTS;
                            break;

                        case (int)Helper.UserRole.RPC:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkRPC = new LinkButton();
                            lnkRPC.EnableViewState = true;
                            lnkRPC.Text = "RPC" + "<br />";
                            lnkRPC.ID = "lnkRPC" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkRPC);
                            lnkRPC.Visible = true;
                            lnkRPC.PostBackUrl = PresentationConstant.ASPX_ARDREPORTS;
                            break;

                        case (int)Helper.UserRole.RegionalManager:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkRegionalManager = new LinkButton();
                            lnkRegionalManager.EnableViewState = true;
                            lnkRegionalManager.Text = "Regional Manager" + "<br />";
                            lnkRegionalManager.ID = "lnkRegionalManager" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkRegionalManager);
                            lnkRegionalManager.Visible = true;
                            lnkRegionalManager.PostBackUrl = PresentationConstant.ASPX_RMREPORTS;
                            break;

                        case (int)Helper.UserRole.MerchAdmin:
                            Session[AppConstants.ROLEID] = UserCredentialsDT.Rows[i]["RoleId"];
                            LinkButton lnkMerchAdmin = new LinkButton();
                            lnkMerchAdmin.EnableViewState = true;
                            lnkMerchAdmin.Text = "Merch Admin" + "<br />";
                            lnkMerchAdmin.ID = "lnkMerchAdmin" + i.ToString();
                            PlaceHolderRoles.Controls.Add(lnkMerchAdmin);
                            lnkMerchAdmin.Visible = true;
                            lnkMerchAdmin.PostBackUrl = PresentationConstant.ASPX_MERCHANDISINGADMIN;
                            break;

                        default:
                            ClientScript.RegisterStartupScript(this.GetType(), "msg", "<script type=\"text/javascript\"> alert('Invalid Role.');</script>");
                            break;
                    }

                }
            }
        }
    }



  private String GetStoresForStoreManager_Table(Int32 iStoreManagerId)
    {
        String strDestinationPage = String.Empty;
        String strStoreNo = String.Empty;
        String strStoretypeId = String.Empty;

        String strStoretype = String.Empty;
        DataTable dtStoreDetails = null;

        StoreBL objStoreBL = new StoreBL();
        dtStoreDetails = objStoreBL.GetStoresForStoreManager_Table(iStoreManagerId);

        if (dtStoreDetails.Rows.Count != 0)
        {
            if (dtStoreDetails.Rows.Count > 1)
            {
                strDestinationPage = PresentationConstant.ASPX_CHOOSESTORE;
            }
            else
            {
                strStoreNo = dtStoreDetails.Rows[0][AppConstants.STORENO].ToString();
                strStoretypeId = dtStoreDetails.Rows[0][AppConstants.ID].ToString();
                if (dtStoreDetails.Rows[0][AppConstants.ISRETAIL].ToString().ToLower() == "true")
                {
                    strStoretype = DBConstants.RETAIL;
                }
                else
                {
                    strStoretype = DBConstants.SandR;
                }
                Session.Add(AppConstants.STORENO, strStoreNo);
                Session.Add(AppConstants.STORETYPEID, strStoretypeId);
                Session.Add(AppConstants.STORETYPE, strStoretype);
                strDestinationPage = PresentationConstant.ASPX_STOREMAIN;
            }
        }
        else
        {
            ClientScript.RegisterStartupScript(this.GetType(), "msg", "<script type=\"text/javascript\"> alert('You are not associated with any store.');window.location = 'SprintLogin.aspx';</script>");
        }
        return strDestinationPage;

    }
    protected void lnkAdmin_Click(object sender, System.EventArgs e)
    {
        Response.Redirect(PresentationConstant.ASPX_MERCHANDISINGADMIN);
    }

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    线

    if (!IsPostBack)
    

    将导致您的页面不在回发中创建动态按钮,因此 ASP.Net 框架将找不到引发事件的控件。

    不过,我想知道为什么您没有收到 ViewState 异常。

    【讨论】:

      【解决方案2】:

      我认为你应该create dynamic controls in the PreInit event handler。但是,在这种情况下,devio 的回答似乎是您问题的真正原因。

      【讨论】:

        【解决方案3】:

        我认为您最好只在页面上使用链接按钮并根据您所处的情况设置文本/属性。完全省去所有动态控制的麻烦。

        编辑:

        抱歉,刚刚看到您的 foreach - 可能是转发器中的链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 2018-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多