ajax调用用户控件时,用户控件无法执行后台代码,如何解决?

agclqq 2009-07-07 12:11:32
首先
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.cs

using 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没有执行
...全文
755 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
agclqq 2009-07-08
  • 打赏
  • 举报
回复
新开一加分贴,如果大家有更好的方法,希望不吝赐教!

新贴地址:http://topic.csdn.net/u/20090708/10/bbee3282-140a-452c-b0e0-69bf6d9c158c.html
agclqq 2009-07-08
  • 打赏
  • 举报
回复
非常感谢 Sandy945 的大力支持,
第一、用你的方法,可以做到,是没问题的,
第二、但是有一点是,别人如果知道路径的话,可以访问到 ~/admin/Temp.aspx,一般情况下,我是不愿意出现这种结果
第三、是否还有别的方法来实现这种数据更新,可以考虑其他任何方法,即使连用户控件不会用到都可以
加分再求一种新方法,谢谢
阿非 2009-07-08
  • 打赏
  • 举报
回复
已经不用RenderUserControl 这个方法了啊 ~

你现在的代码是怎么写的
wenblue7 2009-07-07
  • 打赏
  • 举报
回复
支持一下三楼
agclqq 2009-07-07
  • 打赏
  • 举报
回复
再补发一下 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();
}
阿非 2009-07-07
  • 打赏
  • 举报
回复
tool.RenderUserControl
你这个方法代码是怎么写的
agclqq 2009-07-07
  • 打赏
  • 举报
回复
高手继续进
ralpha08 2009-07-07
  • 打赏
  • 举报
回复
因为你是异步处理
context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件
这一步根本不会在前台处理,用xmlhttprequest前台的所有更改都必须用javascript处理,后台所做的针对控件的任何更改都不会反映到前台
agclqq 2009-07-07
  • 打赏
  • 举报
回复
没有人来吗
agclqq 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sandy945 的回复:]
你如果一定要用自定义控件的话,这样改

创建一个web 窗体,和自定义控件同目录 ,随便命名,假设命名为 Temp.aspx
需要注意的是 将.aspx 文件中的代码 删除 只保留
HTML code<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Temp.aspx.cs" Inherits="ajax_xmlHttpRequest_Temp"%>
这行

然后 在Temp.aspx.cs 中 重写 OnInit 方法 ,如下

C# codeprotectedoverridevoid OnInit(EventArgs e)
{
Control control= LoadControl("~/admin/dylist.ascx");// or Control control = LoadControl("/dylist.ascx"); Controls.Add(control);base.OnInit(e);
}

然后 修改del.ashx

C# code
context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件
改成
C# code
context.Response.Redirect("~/admin/Temp.aspx");

[/Quote]
回10楼,非常感谢,但是照你的方法,还是出现了点问题,如下图所示

阿非 2009-07-07
  • 打赏
  • 举报
回复
你如果一定要用自定义控件的话,这样改

创建一个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");

conan19771130 2009-07-07
  • 打赏
  • 举报
回复
up
agclqq 2009-07-07
  • 打赏
  • 举报
回复
再发一下图
agclqq 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ralpha08 的回复:]
因为你是异步处理
context.Response.Write(tool.RenderUserControl("~/admin/dylist.ascx"));//加载用户控件
这一步根本不会在前台处理,用xmlhttprequest前台的所有更改都必须用javascript处理,后台所做的针对控件的任何更改都不会反映到前台
[/Quote]
不太理解是什么意思,
以下将我的程序的大致流程做了个简易的流程示意图,请高手帮帮忙,谢谢,如果用户控件无后台代码运行,ajax程序运行非常正常,就是不能运行用户控件的后台代码,如果改为JS,请问如何写,高手能否给个示例?谢谢
附上图
dixinchonger8 2009-07-07
  • 打赏
  • 举报
回复
高手那里去了?

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧