为什么我的链接按钮命令功能没有被触发?

时间:2014-03-25 11:55:50

标签: c# asp.net

我的代码隐藏中有这个代码:

   for (int i = 0; i < linkList.Count; i++)
            {
                var link = UppercaseFirst(linkList[i]);
                var linkButton = new LinkButton
                    {
                        Text = link + " > ",
                        ID = Convert.ToString(i),
                        CommandArgument = urlList[i]
                    };
                linkButton.Command += new CommandEventHandler(lnkWeb_Click);
                bcHolder.Controls.Add(linkButton);

            }

这里是lnkWeb_Click方法:

protected void lnkWeb_Click(object sender, CommandEventArgs e)
        {
          var url = e.CommandArgument.ToString();
          //code...
        }

单击其中一个生成的链接按钮时,不会触发此方法。

任何人都知道问题是什么?

在aspx文件中尝试了OnCommand="lnkWeb_Click"并且方法被触发,但不是我通过代码生成的那些。他们甚至没有OnCommand="lnkWeb_Click"属性。

1 个答案:

答案 0 :(得分:1)

这里的问题在于控制生命周期。如果您想正确处理某些控件的事件 - 您必须在每个页面加载过程中将此控件添加到页面,即每次回发。

看看你的情况会发生什么:

  1. 点击初始按钮
  2. 在回发期间,您的动态链接按钮会添加到页面中,事件处理程序会分配给它们
  3. 用户点击新生成的链接按钮
  4. 在回发期间,这些动态链接按钮不会再次添加到页面中,ASP.NET不知道事件的来源,因此它不会调用处理程序。
  5. 要解决此问题,您可能需要在View State中存储有关必须添加的链接按钮的信息(请不要存储控件本身,这将是一个巨大的开销)。还要注意他们的ID - 对于相同的控件,它们必须相同。

    更新。有关View State解决方案的更多提示。

    基本上你需要一些指标,在页面加载过程中你需要创建一些动态链接按钮。最基本的方法是存储链接按钮标识符(或文本或两者)的列表,然后在Page_Load期间检查视图状态中是否存在任何内容。例如:

    // Property to access the view state data
    protected List<string> Links
    {
        get { return ViewState['links']; }
        set { ViewState['links'] = value; }
    }
    
    ...
    
    protected void Page_Load(object sender, EventArgs e)
    {
        ...
        if (this.Links != null && this.Links.Count > 0)
        {
            // inside this method you create your link buttons and add them to the page
            // you actually have this code already
            RenderLinkButtons();
        }
    }
    
    ...
    
    // Not sure about what name you have here
    protected void InitialButtonHandlerName(object sender, EventArgs e)
    {
        List<string> linkList = ...; //your variable, guessing a type
    
        // this is exactly the method you use already to add links to the page
        // just one more action added to it - store info about these links into View State to use it on later post backs
        this.Links = linkList;
        RenderLinkButtons();    
    }
    

    请在正确的方向上使用它 - 根据您的要求和偏好,您可能会有不同的实施方式。但我希望现在的概念很清楚。