当前位置:编程学习 > C#/ASP.NET >>

asp.net ajax关于动态加载用户控件非常棘手的超难问题,内有示例链接.高手指教了~~~

关于动态加载ASCX控件.为了实现全站后台管理只有一个页面愚蠢至极的想法.我采用了动态加载ASCX用户控件的方法来实现.
在实现中遇到了N多的难题.开发环境是ASP.NET 2.0 ASP.NET AJAX 1.0
为了达到加载后的控件能在UPDATEPANEL内部自由切换.我用了老赵的控件(控件地址:http://www.cnblogs.com/JeffreyZhao/archive/2007/03/29/SwitchPartManager.html)
我稍做了一下修改可以在切换时传递一个参数给ASCX控件.

于是做了个简单的页面来让大家看一下效果
只有一个DEFAULT.ASPX页
        protected void Page_Load(object sender, EventArgs e)
        {
            ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
            scriptManager.RegisterAsyncPostBackControl(this.Button1);
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Control uc=LoadControl("List.ascx");
            //Panel1.Controls.Add(uc);
            SwitchManager.GetCurrent(this.Page).SwitchTo("List");
        }
有一个List.ascx控件,显示列表
        protected void DataList1_DeleteCommand(object source, DataListCommandEventArgs e)
        {

            int id = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);
            ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
            scriptManager.RegisterAsyncPostBackControl((LinkButton)DataList1.Items[e.Item.ItemIndex].FindControl("LinkButton1"));
            SwitchManager.GetCurrent(this.Page).SwitchTo("Update", id);
        }
update.ascx用于更新.
 protected void Page_Load(object sender, EventArgs e)
        {
            //hidArticleId.Value = this.articleId.ToString();

            //初始化表单




            bbb += 1;

            SqlCommand command = new SqlCommand("SELECT * FROM Article WHERE Aid="+this.articleId.ToString(), conn);
            SqlDataReader dr;
            conn.Open();
            dr = command.ExecuteReader();

            if (dr.Read())
            {
        
                TextBox1.Text = dr["Title"].ToString();


                DropDownList1.SelectedValue = dr["ClassId"].ToString();
                HiddenField1.Value = this.articleId.ToString();
            }
            dr.Close();
            conn.Close();
            TextBox2.Text = bbb.ToString();
        }
        public int Id
        {
            get { return articleId; }
            set { articleId = value; }
        }

        protected void Submit_Command(object sender, CommandEventArgs e)
        {
            int aid = Convert.ToInt32(HiddenField1.Value);
            if (aid >= 0)
            {
                conn.Open();
                string title = TextBox1.Text;

                SqlCommand command = new SqlCommand("Update Article Set Title='" + title + "',ClassId=" + aid.ToString() + " WHERE Aid=" + aid.ToString(), conn);

                command.ExecuteNonQuery();
                conn.Close();


                if (e.CommandName == "OK") { SwitchManager.GetCurrent(this.Page).SwitchTo("List"); }
                //else { SwitchManager.GetCurrent(this.Page).SwitchTo("Update",aid); }

            }
        }

首先点击ButtonA 加载列表页,然后点击编辑,进入编辑页.这个页面出现很多问题.
首先ASCX页面有自己的PAGELOAD事件.但却没有自己的IsPostBack属性.他使用的是主页面的IsPostBack,当点击ButtonA时,已经是一个回传了.IsPostBack使终是True. 这真是太烦了.没有了这个属性更新数据库真是很糟糕.在点击更新时先触发了ASCX控件的PAGELOAD事件,此事件里的所有代码因为没有ISPOSTBACK又被重新执行了一遍.但更新竟然成功了.

问题一
百思不得其解,为什么这里会更新成功?? 但还是不怎么完美,因为不想被执行的代码在操作时总是被再次执行.

问题二.
为了想达到软件的效果.我做了一个确定和应用.点应用时数据被更新,不跳转页面.但是接下来出现视图状态验证错误的消息,这个我是一点也不知道了.

高手请指教一下.

效果演示
http://www.njyyjy.com/j/ --------------------编程问答-------------------- 说错一下地方,dropdownlist的值不能被更新进去.而textbox的值可以. --------------------编程问答-------------------- 为啥没人回答呢? --------------------编程问答-------------------- 你可以参考一下我这个:
http://www.cnblogs.com/cathsfz/archive/2006/12/10/587925.html --------------------编程问答-------------------- up





--
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,