大家好!我今天碰到了一个奇怪的问题。现在简单描述如下(由于是公司的控件,省去大部分代码):
我有一个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吗?请各位指教。

解决方案 »

  1.   

    你保存属性的时候没用ViewState吧?
    我猜的比如public int Page{
       get{return (ViewSate["Page"]==null)?1:(int)ViewSate["Page"];}
       set{ViewSate["Page"]=value;}
    }
      

  2.   

    用了啊。
    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也是对的。就是页面出来以后还是不变。
      

  3.   

    WelcomeLabel 定义一个 Text 属性,并使用视图状态存储该属性值。使用视图状态保存回发间的 Text 值。每次回发时,将重新创建页并从视图状态还原值。如果 Text 值并未存储在视图状态中,则在每次回发时会将值设置为其默认的 Empty。ViewState 属性继承自 WebControl,是保存数据值的字典。通过使用 String 键,可输入和检索值。本例中将“Text”用作键。字典中的项被类型化为 Object,然后必须将其强制转换为属性类型。有关更多信息,请参见 ASP.NET 状态管理概述。MSDN上面的解释,不使用ViewSate,每次callback的时候,值会被还原成初始值。你看看是不是这个原因
      

  4.   

    你可以在一个纯粹的 html+javascript 的页面上实验一下,当你修改一个dhtml元素的html的时候,如果其中有你的这类“<script>...</script>”代码,它根本不会执行。这样写的脚本只有在加载页面时才会执行。向页面注册脚本,不论是否使用ajax,都有 RegisterStartupScript 以及 RegisterClientScriptBlock 方法,而不应该是你的这种 writer.write 写法。
      

  5.   

    我已经试验过了,如果不使用ajax,就是正常的asp.net页面。js是正常的,就是变为了if (page > 3 || page < 1 || isNaN(page))。这是不是说明是ajax的问题呢?
      

  6.   

     //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