首先
aspx页面,加截用户控件dylist.ascx
点击按钮,触发JS事件
用到的JS如下function del(Obj) {
    alert('确定删除吗?这个操作不可逆!');
    var d=new Date();
//提交删除请求的URL变量
   var strURL="del.ashx?id="+Obj.id+"&d="+d.getTime();
   
   xmlDom.Open("get",strURL,true);                   //XMLHTTP打开
   xmlDom.onreadystatechange=function()              //XMLHTTP状态改变时调用的事件
   {
      if(xmlDom.readyState==4)
        if(xmlDom.status==200)     
          {     
            if(xmlDom.responseText!="")    // //删除成功
               {
                  document.getElementById("nav").innerHTML=xmlDom.responseText;  //显示删除后的界面
                 
               }
            else
              alert("意外错误!请联系开发人员!");
           }
         else                                                   //出现错误
          document.getElementById("loadingflag").innerHTML="向服务器请求数据时出现错误!";
    }
   xmlDom.Send(xmlDom);
   document.getElementById("loadingflag").style.display='';             //显示加载的页面提示效果
 }
JS提交到del.ashx,执行删除及加载用户控件,以下为主要代码 string id= context.Request.QueryString["id"].ToString();
 string times = context.Request.QueryString["d"].ToString();
dds = a.TdataSet("delete from wap_dy where id='" + id + "' ");//dataset类
context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件
下面执行到用户控件,以下为用户控件主要代码:
dylist.ascx<%@ Control Language="C#" AutoEventWireup="true" CodeFile="dylist.ascx.cs" Inherits="admin_dylist" %><%=str%><br /><%=page%>
dylist.ascx.csusing System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;public partial class admin_dylist : System.Web.UI.UserControl
{
    db a = new db();
    db b = new db();
    DataSet dds = new DataSet();
    DataSet ddsid = new DataSet();
    public string str = "";
    public string name;
    public string page;
    int bs = 20;
    int pages;
    protected void Page_Load(object sender, EventArgs e)
    {
        ddsid = a.TdataSet("SELECT  * FROM [wap_dy] order by id desc");
        if (ddsid.Tables["temp"].Rows.Count > 0)
        {
            int[] idarray = new int[ddsid.Tables["temp"].Rows.Count];
            for (int k = 0; k < ddsid.Tables["temp"].Rows.Count; k++)
            {
                idarray[k] = Convert.ToInt32(ddsid.Tables["temp"].Rows[k].ItemArray[0]);//存储符合条件的ID
            }
            try
            {
...
//内容过多,就不再粘贴了
我在网上看到有人说,ajax调用用户控件,不会执行Page_Load,是这样吗,请问如何解决?我现在调到的内容只有<br />,也就是跟网友所说一样,Page_Load没有执行

解决方案 »

  1.   

    因为你是异步处理
    context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件
    这一步根本不会在前台处理,用xmlhttprequest前台的所有更改都必须用javascript处理,后台所做的针对控件的任何更改都不会反映到前台
      

  2.   

    tool.RenderUserControl
    你这个方法代码是怎么写的
      

  3.   

    再补发一下 tool.cs主要文件 public static string RenderUserControl(string UserControlName)
        {
            StringBuilder sb = new StringBuilder();
            System.IO.StringWriter sw = new System.IO.StringWriter(sb);//定义变量
            HtmlTextWriter writer = new HtmlTextWriter(sw);
            UserControl uc = new UserControl();
            Control d = uc.LoadControl(UserControlName);
            d.RenderControl(writer);
            return sb.ToString();
        }
      

  4.   

    不太理解是什么意思,
    以下将我的程序的大致流程做了个简易的流程示意图,请高手帮帮忙,谢谢,如果用户控件无后台代码运行,ajax程序运行非常正常,就是不能运行用户控件的后台代码,如果改为JS,请问如何写,高手能否给个示例?谢谢
    附上图
      

  5.   

    你如果一定要用自定义控件的话,这样改 创建一个web 窗体,和自定义控件同目录 ,随便命名,假设命名为 Temp.aspx
    需要注意的是 将.aspx 文件中的代码 删除 只保留 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Temp.aspx.cs" Inherits="ajax_xmlHttpRequest_Temp" %>这行 然后 在Temp.aspx.cs 中 重写 OnInit 方法 ,如下
        protected override void OnInit(EventArgs e)
        {
            Control control = LoadControl("~/admin/dylist.ascx");
            // or Control control = LoadControl("/dylist.ascx");
            Controls.Add(control);
            base.OnInit(e);
        }
    然后 修改del.ashx
    将context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件改成 context.Response.Redirect("~/admin/Temp.aspx");
      

  6.   

    已经不用RenderUserControl 这个方法了啊 ~你现在的代码是怎么写的
      

  7.   

    非常感谢 Sandy945 的大力支持,
    第一、用你的方法,可以做到,是没问题的,
    第二、但是有一点是,别人如果知道路径的话,可以访问到 ~/admin/Temp.aspx,一般情况下,我是不愿意出现这种结果
    第三、是否还有别的方法来实现这种数据更新,可以考虑其他任何方法,即使连用户控件不会用到都可以
    加分再求一种新方法,谢谢
     
      

  8.   

    新开一加分贴,如果大家有更好的方法,希望不吝赐教!新贴地址:http://topic.csdn.net/u/20090708/10/bbee3282-140a-452c-b0e0-69bf6d9c158c.html