ajax render的奇怪问题。紧急求救

lovepp2004 2008-12-15 11:22:51
大家好!我今天碰到了一个奇怪的问题。现在简单描述如下(由于是公司的控件,省去大部分代码):
我有一个pagebar控件,render方法为:
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<script language='javascript'>\n");
writer.Write("function " + this.UniqueID + "ChangePage(page)\n");
writer.Write(@"{");
writer.Write("if (page == {0}) return;\n",this.CurrentPage);
writer.Write("if (page > {0} || page < 1 || isNaN(page))", this.PageCount);
writer.Write(@"
{
alert('请输入正确的页码!');
return;
}
");
writer.Write("__doPostBack('" + this.UniqueID + "',page)");
//writer.Write(Page.ClientScript.GetPostBackEventReference(this, "page"));
writer.Write(@"
}
</script>
");
.....此处省略其他输出内容
base.Render(writer);
}
这个控件用在了一个使用了ajax的页面中。所有控件都在一个scriptmanager的updatepanel中,第一次载入,由于pagecount=1,所以里面那个js的内容有一句为:
if (page > 1 || page < 1 || isNaN(page)).这是正确的。
但是我点击了页面的按钮提交了新的查询条件,这时候pagecount变为了3,按理说新页面的js的话应该变为:
if (page > 3 || page < 1 || isNaN(page))。
但是实际上不是这样的,页面上还是if (page > 1 || page < 1 || isNaN(page)).导致输入2,3会提示错误。但是我跟踪源代码发现到base.Render(writer);处write里面的内容确实是if (page > 3 || page < 1 || isNaN(page)),但是为什么最后到了页面上没有变化呢?是因为ajax的原因吗?ajax局部刷新的条件是什么?难道是因为这个js的方法名称和参数都没有变化就没有render吗?请各位指教。
...全文
135 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovepp2004 2008-12-16
  • 打赏
  • 举报
回复
最后的都是正确的啊。就是页面输出不行啊。
ChengKing 2008-12-16
  • 打赏
  • 举报
回复
//Ajax框架中新调用方式
ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "UpdateSucceed", "alert('Update time succeed!')", true);

//默认调用方式(在异步调用XmlHttp方式中无效)
//Page.ClientScript.RegisterStartupScript(this.GetType(), "UpdateSucceed", "<script>alert('Update time succeed!')</script>");



Asp.net Ajax框架教程:
http://blog.csdn.net/ChengKing/archive/2008/01/09/2032497.aspx
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
调试下看是哪里传递错误哦?
是不是事件在进行委托的时候,或之前就没获取到呢?
lovepp2004 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]
你可以在一个纯粹的 html+javascript 的页面上实验一下,当你修改一个dhtml元素的html的时候,如果其中有你的这类“ <script>... </script>”代码,它根本不会执行。这样写的脚本只有在加载页面时才会执行。

向页面注册脚本,不论是否使用ajax,都有 RegisterStartupScript 以及 RegisterClientScriptBlock 方法,而不应该是你的这种 writer.write 写法。
[/Quote]

我就是为了往页面上写一个js函数,再点击一个按钮的时候作为客户端的验证,看是不是输入的页码太大了。
lovepp2004 2008-12-15
  • 打赏
  • 举报
回复
我已经试验过了,如果不使用ajax,就是正常的asp.net页面。js是正常的,就是变为了if (page > 3 || page < 1 || isNaN(page))。这是不是说明是ajax的问题呢?
  • 打赏
  • 举报
回复
你可以在一个纯粹的 html+javascript 的页面上实验一下,当你修改一个dhtml元素的html的时候,如果其中有你的这类“<script>...</script>”代码,它根本不会执行。这样写的脚本只有在加载页面时才会执行。

向页面注册脚本,不论是否使用ajax,都有 RegisterStartupScript 以及 RegisterClientScriptBlock 方法,而不应该是你的这种 writer.write 写法。
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
那不清楚了
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
WelcomeLabel 定义一个 Text 属性,并使用视图状态存储该属性值。使用视图状态保存回发间的 Text 值。每次回发时,将重新创建页并从视图状态还原值。如果 Text 值并未存储在视图状态中,则在每次回发时会将值设置为其默认的 Empty。ViewState 属性继承自 WebControl,是保存数据值的字典。通过使用 String 键,可输入和检索值。本例中将“Text”用作键。字典中的项被类型化为 Object,然后必须将其强制转换为属性类型。有关更多信息,请参见 ASP.NET 状态管理概述。

MSDN上面的解释,不使用ViewSate,每次callback的时候,值会被还原成初始值。你看看是不是这个原因
lovepp2004 2008-12-15
  • 打赏
  • 举报
回复
用了啊。
public int PageCount
{
get
{
return (this.RecordCount == 0 ? 0 : (int)Math.Ceiling((double)this.RecordCount / this.PageSize));
}
}

public int RecordCount
{
get
{
return (ViewState[this.UniqueID + "RecordCount"] == null) ? 0 : (int)ViewState[this.UniqueID + "RecordCount"];
}

set
{
ViewState[this.UniqueID + "RecordCount"] = value;
}
}
并且跟踪的时候pagecount确实是3了已经。并且htmltextwriter中的js也是对的。就是页面出来以后还是不变。
tommy9802 2008-12-15
  • 打赏
  • 举报
回复
帮您顶一下,非常抱歉,不太明白你的问题 ^_^
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
你保存属性的时候没用ViewState吧?
我猜的

比如

public int Page{
get{return (ViewSate["Page"]==null)?1:(int)ViewSate["Page"];}
set{ViewSate["Page"]=value;}
}

62,025

社区成员

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

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

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

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