C#asp.net为什么我的手册__doPostBack只运行一次?

时间:2009-10-07 09:27:27

标签: c# asp.net

在我的代码中,我动态创建菜单项:

string listClientID = BulletedList1.ClientID.Replace('_', '$');
int counter = 0;

foreach (DataRow dataRow in database.DataTable.Rows)
{
    // Add Button
    ListItem listItem = new ListItem();
    listItem.Value = "buttonItem" + Convert.ToString(dataRow["rank"]);
    listItem.Text = " " + Convert.ToString(dataRow["title"]);
    listItem.Attributes.Add("onclick", "__doPostBack('" + listClientID + "', '"+ counter.ToString() +"')");

    BulletedList1.Items.Add(listItem);

    counter++;

}

此菜单位于更新面板中:

<div id="MenuItemBox">
    <asp:BulletedList 
        ID="BulletedList1" 
        runat="server"
        OnClick="MenuItem_Click"
        >
    </asp:BulletedList>
</div>

我想要的是当点击列表项时它会执行回发。但是当我运行它时,onclick事件只运行一次。

例如。我有4个列表项目。当我第一次执行onclick事件时单击第一个项目。现在我单击第二个项目,也会执行onclick事件。但是,当我现在再次单击第一个项目时,onclick事件不会被触发。

当我在FireFox或Oprah中检查错误控制台时,我没有收到任何错误。

所以我的问题是:如何解决这个问题以及我做错了什么?

2 个答案:

答案 0 :(得分:1)

似乎你需要在回发后重新绑定它。 在哪里添加项目到菜单,你在检查IsPostBack属性? 请在首次加载和postpack后比较html,看看_dopostback是否消失。

然后尝试删除IsPostBack检查。 我的代码运行良好。 就是这样。

public partial class _Default : System.Web.UI.Page {
    protected void Page_Load (object sender, EventArgs e) { }

    protected override void OnInit (EventArgs e) {
        base.OnInit(e);
        //if (!IsPostBack) {
            string listClientID = BulletedList1.ClientID.Replace('_', '$');
            int counter = 0;

            List<SomeClass> items = new List<SomeClass>(){ new SomeClass() { Rank = 1, Title = "2"},
            new SomeClass () {Rank = 2, Title = "Two"}};


            foreach (var item in items) {
                // Add Button
                ListItem listItem = new ListItem();
                listItem.Value = "buttonItem" + item.Rank;
                listItem.Text = " " + item.Title;
                listItem.Attributes.Add("onclick", "__doPostBack('" + listClientID + "', '" + counter.ToString() + "')");

                BulletedList1.Items.Add(listItem);

                counter++;

            }
        //}
    }

    protected void MenuItem_Click (object sender, BulletedListEventArgs e) {
        Response.Write(e.Index);
    }

    class SomeClass {
        public int Rank;
        public string Title;
    }
}

答案 1 :(得分:0)

可能是UpdatePanel造成了麻烦。我会尝试将它拉出UpdatePanel然后会看到(我相信它应该)如果有效吗?

其次,您可以只填充列表项值和文本,然后在mnuMainMenu_MenuItemClick(对象发送者,MenuEventArgs e)事件下填充;查找已被点击的特定项目(e.Item。*公共属性),然后可能会使用Response.Redirect()来完成工作;好吧,只是大声思考......