加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将代码中的值从aspx传递给事件处理程序

发布时间:2020-12-15 17:23:58 所属栏目:百科 来源:网络整理
导读:我在msdn论坛上问了这个问题,除了一个人提出实际上是一个解决方法之外,每个人都很难过. 在我的Webforms项目中,我有一些aspx代码,如下所示: %for (int i = 0; i 10; i++) %%{ % asp:Button runat="server" Text="Click Here" OnClick="MyButtonHandler" /%}
我在msdn论坛上问了这个问题,除了一个人提出实际上是一个解决方法之外,每个人都很难过.

在我的Webforms项目中,我有一些aspx代码,如下所示:

<%for (int i = 0; i < 10; i++) %>
<%{ %>
    <asp:Button runat="server" Text="Click Here" OnClick="MyButtonHandler" />
<%} %>

代码成功呈现10个按钮,说“点击这里”

我想要做的是,创建一个事件处理程序,用于单击将i作为参数的按钮.

protected void MyButtonHandler(object sender,EventArgs e)
    {
        //do something with i
    }

关于我在msdn第一次提出这个问题的时候我正在研究的项目,我最终做了一些完全不同的事情,但是,如果有办法做我想做的事情,我非常想知道如何.

解决方法

正如这个线程所证明的那样,将变量(如i)的值直接从标记放入服务器控件并不是一件容易的事.正如Joe正确指出的那样,代码渲染块(<%= i%>)在服务器控件中不起作用. <%= i%>语法在html标记中效果很好,但服务器控件(如按钮)不支持它.

我建议使用转发器将控制流程从标记转移到代码隐藏.这将允许您从后面的代码设置命令参数.这与asp.net的工作方式更为一致.所以……

<%for (int i = 0; i < 10; i++) %>
    <%{ %>
      <asp:Button runat="server" Text="Click Here" OnClick="MyButtonHandler" />
    <%} %>

会变得更像

<asp:Repeater ID="ButtonRepeater" runat="server" 
        onitemdatabound="ButtonRepeater_ItemDataBound">
        <ItemTemplate>
            <asp:Button id="MyButton" runat="server" Text="Click Here" OnClick="MyButtonHandler" />
        </ItemTemplate>
    </asp:Repeater>

您当然可以在ItemTemplate标记中添加所需的所有html.然后在后面的代码中添加以下内容.

protected void Page_Load(object sender,EventArgs e)
    {
        this.ButtonRepeater.DataSource = new[] { 1,2,3,4,5 }; // however many items you want
        this.ButtonRepeater.DataBind();
    }

    protected void MyButtonHandler(Object sender,EventArgs e)
    {
        Button b = sender as Button;
        if (b != null)
        {
            string cmdName = b.CommandName;
            // logic based on cmdName
        }
    }

    protected void ButtonRepeater_ItemDataBound(object sender,RepeaterItemEventArgs e)
    {
        var button = e.Item.FindControl("MyButton") as Button;
        if (button != null)
        {
            var buttonNumber = e.Item.DataItem.ToString();
            button.CommandName = buttonNumber;
            button.ID = string.Format("MyButton_{0}",buttonNumber); // required to prevent event validation error
        }
    }

我实际上通过在cmdName变量上的事件处理程序中放置一个断点来测试它.它是根据我点击的按钮正确设置的.

这是一种范式转换,但这是一个符合ASP.NET意图的转变.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读