Response.End()使得RegisterStartupScript失效的问题

yeagen 2008-12-29 12:25:57

protected void Button1_Click(object sender, EventArgs e)
{
string js = "<script>alert('您未登陆,无法操作');</script>";
if(Session["name"] == null)
{
ScriptManager.RegisterStartupScript(Updatepanel1, Updatepanel1.GetType(), "Startup", js, false);
Response.End();//这句如果不加的话,是可以有提示框的
}
}


我在网上找了一下了,网上的解决方法是用Response.Write(js);来替代Page.ClientScript.RegisterStartupScript
但这样会有两个问题:
1.由于Response.Write是把JS代码打印在HTML文档的顶部,会使CSS失效
2.如果Button1的事件是在UpdatePanel中触发的,由于UpdatePanel触发的代码中有Response.Write是无法通过的
(而我在其实应用中正是通过UpdatePanel触发的)

我不想使用if进行功能代码的判断,因为这样我就无法把这个功能写成一个类了,例如这种:

protected void Button1_Click(object sender, EventArgs e)
{
string js = "<script>alert('您未登陆,无法操作');</script>";
if(Session["name"] == null)
{
ScriptManager.RegisterStartupScript(Updatepanel1, Updatepanel1.GetType(), "Startup", js, false);
}
else
{
//功能代码
}
}


是不是Response.End真的无法与RegisterStartupScript同时使用呢?
...全文
414 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsn517471114 2008-12-30
  • 打赏
  • 举报
回复
.NET联盟会馆 QQ群号:77329563 招聘中.....
yeagen 2008-12-29
  • 打赏
  • 举报
回复
您说的也是,我再去翻翻其他的资料,抓破头皮了,呵呵
hhx_1120 2008-12-29
  • 打赏
  • 举报
回复
yeagen好! 我是这么理解做的:


<asp:TextBox ID="txtTest" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
<asp:Label ID="lblmsg" runat="server" Text=""></asp:Label>
<asp:Label ID="lblmsg2" runat="server" Text="Error Message" Visible="false"></asp:Label>



protected void Button1_Click(object sender, EventArgs e)
{
Session["msg"] = txtTest.Text.ToString();
//如果为空,则将原隐藏的Label显示出来.
if(string.IsNullOrEmpty((string) Session["msg"]))
{
lblmsg2.Attributes["Style"] = "display:block";
//为空时的处理代码
// ...........
}
else
{
lblmsg.Text = "Hoho Succeed";
//满足条件的处理代码
// ..........
}
}


不过,看到楼上ojlovecd写的,感觉更有条理些.. 嘿嘿. 学习了.
我姓区不姓区 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yeagen 的回复:]
您说的这种是可以的,不过,我原来是想偷个懒的,想来个一步到位,以后用起来也以方便,而且我现在修改的以前的旧代码,所以只想着把类修改一下,主程序中的代码不是很想去修改...

如果说,Response.end这个不行话,有没有通过类强制中止主程序的方法呢?

如果没有的话,可能只好去修改主程序的代码了
[/Quote]
比较困难,在方法内部想改变方法外的代码流程,这个设计思想本来就不太好。
yeagen 2008-12-29
  • 打赏
  • 举报
回复
您说的这种是可以的,不过,我原来是想偷个懒的,想来个一步到位,以后用起来也以方便,而且我现在修改的以前的旧代码,所以只想着把类修改一下,主程序中的代码不是很想去修改...

如果说,Response.end这个不行话,有没有通过类强制中止主程序的方法呢?

如果没有的话,可能只好去修改主程序的代码了
我姓区不姓区 2008-12-29
  • 打赏
  • 举报
回复
看明白了,那你可不可以另CheckLogin返回一个bool值?根据这个值判断代码是否接着往下走:

//App_Code/lib.cs类文件中:
static public bool CheckLogin(Updatepanel1)
{
string js = "<script>document.all.logindiv.style.display = 'block';</script>";
if(Session["name"] == null)
{
ScriptManager.RegisterStartupScript(Updatepanel1, Updatepanel1.GetType(), "Startup", js, false);
return false;
}
return true;
}

主程序中
protected void Button1_Click(object sender, EventArgs e)
{
if(CheckLogin(UpdatePanel1))
{
string sqlcmd = "insert into message (title) values (@title)";
//后面就是接下去的往数据库里写记录的代码了
}
}

yeagen 2008-12-29
  • 打赏
  • 举报
回复

App_Code/lib.cs类文件中:
static public void CheckLogin(Updatepanel1)
{
string js = "<script>document.all.logindiv.style.display = 'block';</script>";
if(Session["name"] == null)
{
ScriptManager.RegisterStartupScript(Updatepanel1, Updatepanel1.GetType(), "Startup", js, false);
Response.End();//如果这里用Return的话,只是返回到主程序中,并没有中断主程序以后的执行
}
}

主程序中
protected void Button1_Click(object sender, EventArgs e)
{
CheckLogin(UpdatePanel1);

string sqlcmd = "insert into message (title) values (@title)";
//后面就是接下去的往数据库里写记录的代码了
}


刚刚上面代码有点问题,我也是临时写的,没有测试过,大概就是这个意思,您能看明白不?
yeagen 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ojlovecd 的回复:]
你到底想达到一个什么效果?看了好几次我都没看出来
[/Quote]

是这样的
我想要做一个发贴的程序.
当用户没有登陆时,点击发新贴按钮时,用JS显示出一个隐藏的DIV,DIV中的内容是用户登录框.
与此同时,自动中止,原来按钮的功能


App_Code/lib.cs类文件中:
static public void CheckLogin()
{
string js = "<script>document.all.logindiv.style.display = 'block';</script>";
if(Session["name"] == null)
{
ScriptManager.RegisterStartupScript(Updatepanel1, Updatepanel1.GetType(), "Startup", js, false);
Response.End();//如果这里用Return
}
}

主程序中
protected void Button1_Click(object sender, EventArgs e)
{
CheckLogin();

string sqlcmd = "insert into message (title) values (@title)";
//后面就是接下去的往数据库里写记录的代码了
}

我姓区不姓区 2008-12-29
  • 打赏
  • 举报
回复
你到底想达到一个什么效果?看了好几次我都没看出来
yeagen 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ojlovecd 的回复:]
引用 11 楼 yeagen 的回复:
为了,不让原来的Button1中的程序生效

直接return 不就好了?
[/Quote]

这个代码我最终会写在一个类中,然后在每个需要测试的地方进行调用,如果写return的话,那只是从类中return回主程序
我姓区不姓区 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yeagen 的回复:]
为了,不让原来的Button1中的程序生效
[/Quote]
直接return 不就好了?
yeagen 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wf5360308 的回复:]
不用 Response.End();
直接转到登录页面去!
[/Quote]

可是我想直接在界面上显示出登陆的DIV (WEB2.0常用的这种效果)
yeagen 2008-12-29
  • 打赏
  • 举报
回复
为了,不让原来的Button1中的程序生效
冷月孤峰 2008-12-29
  • 打赏
  • 举报
回复
不用 Response.End();
直接转到登录页面去!
我姓区不姓区 2008-12-29
  • 打赏
  • 举报
回复
为什么要Response.End();
yeagen 2008-12-29
  • 打赏
  • 举报
回复
林鸿,你好

其实我的本意并不是弹出一个alert来,而是想document.all.logindiv.style.display = 'block';

也就是说,如果你没有登陆的话,就把登陆界面的DIV显示出来,如果只是跳转到登陆页当然不用这么麻烦了..
qinhl99 2008-12-29
  • 打赏
  • 举报
回复
//你直接跳转到登录页面不行吗?非要这样不可?
yeagen 2008-12-29
  • 打赏
  • 举报
回复
雨木目,你好
Response.Write(" <script language=javascript>alert('您未登陆,无法操作') <script>");方法在平时是可以使用的
但在UpdatePanel中,Response.write方法会出错
qinhl99 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 DoubleFrost 的回复:]
response.end()就是终止语句执行的,代码一旦执行到response.end()就会停止的 下面的代码就不执行了
[/Quote]
何止啊,我那程序response.end()前面的程序都执行不成功了!
DoubleFrost 2008-12-29
  • 打赏
  • 举报
回复
response.end()就是终止语句执行的,代码一旦执行到response.end()就会停止的 下面的代码就不执行了
加载更多回复(3)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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