两个问题。1. 我建了个test类,类里面写了个JS的alert方法:
 public static void alert(Page page, string msg)
        {
            page.ClientScript.RegisterStartupScript(page.GetType(), "x", "alert('" + msg + "');", true);
        }但是后台调用的时候,需要test.alert(this,"弹出");我想直接test.alert("弹出");  还不想用response.write,怎么办?谢谢。
2. 我发现当后台连续两个page.ClientScript.RegisterStartupScript 的时候,如果这两句话的第二个参数key的值都一样的话,第二个就失效了。只有key的值不一样的时候,这两个脚本才会同时有用。我现在是定义了一个100以内的随机数,然后放在key的位置,然后一般不会冲突。不过好像治标不治本。有没有什么好的办法?谢谢

解决方案 »

  1.   

    吧这个方法写到类里面去
    这个类继承自 System.Web.UI.Page
    然后在调用
    publicstaticvoid alert(string msg)
            {
                page.ClientScript.RegisterStartupScript(this.GetType(),"x","alert('"+ msg+"');",true);
            }
      

  2.   

    public class PageBase : System.Web.UI.Page
    {
        protected void ShowJsMessage(string strErr)
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('" + strErr + "');</script>");    }
    }
    public partial class Query : PageBase //页面继承
      

  3.   


    //调用
    this.alert("弹出")
      

  4.   

    1L 我这个类是在类库里的,然后把类库发布成dll在项目中调用。这样也可以吗?我网站后台的页面一般不继承System.Web.UI.Page,而是继承另外的自己写的类,判断session登陆的类。也可以吗??谢谢
      

  5.   

    如果多个 JavaScript 具有相同的关键字名称,则只会在页面中嵌入第一个 JavaScript。
    写BasePage类,写
    public static void alert(string msg)
            {
               ClientScript.RegisterStartupScript(thisType(), "x", "alert('" + msg + "');", true);
            }
    Page继承BasePage
      

  6.   

    可以撒
    不过这个类还是要继承System.Web.UI.Page
    给你我目前项目里的提示    /// <summary>
        /// JS提示方法
        /// </summary>
        /// <param name="strErr">报错内容</param>
        /// <returns>void</returns>
        protected void ShowJsMessageByClientId(string strErr, string clientId)
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), clientId, "<script>alert('" + strErr + "');</script>");    }    protected void ShowScriptManagerJsMessage(string strErr)
        {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('" + strErr + "')", true);
        }
        protected void ShowScriptManagerJsMessage(string message, string url)
        {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('" + message + "');location.href='" + url + "'", true);
        }    /// <summary>
        /// JS提示方法
        /// </summary>
        /// <param name="strErr">报错内容</param>
        /// <param name="strUrl">转向地址</param>
        /// <returns>void</returns>
        protected void ShowJsMessage(string strErr, string strUrl)
        {
            if (strUrl == "")
            {
                strUrl = Request.RawUrl;
            }
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('" + strErr + "');window.location.href ='" + strUrl + "';</script>");
        }
        /// <summary>
        /// JS提示方法
        /// </summary>
        /// <param name="strErr">报错内容</param>
        /// <returns>void</returns>
        protected void ShowErrCloseWindow(string strErr)
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('" + strErr + "');window.close();</script>");
        }    #endregion
      

  7.   

    说简单点儿就是:JS类继承System.Web.UI.Page ,然后页面再继承JS类。是吗?
      

  8.   

    7L ,为什么你的脚步里还写<script>alert()</script>呢?直接写alert不就好了吗?
      

  9.   

    太对了 ,以上包含有ajax 的提示
      

  10.   

    如果多个 JavaScript 具有相同的关键字名称,则只会在页面中嵌入第一个 JavaScript
    定义不同键值
      

  11.   


    可我在JS类中的键值不是写死的吗?莫非我每次调用JS的时候,都要再传个键值吗?
      

  12.   


    我刚试了,不行啊。连续两个还是只执行第一个。我按照你写的这样,我直接在后台这样写Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>alert('sdf');</script>", true);但是报JS错误了。。为什么呢?
      

  13.   

    方法写在公共函数库里,然后using 调用就是了response.write 也很好啊,为什么不用呢?
      

  14.   

    1、这个问题你要清楚的是,服务器怎么调用客户端的方法?客户端又如何调用服务器方法(这个在你的问题中不涉及),服务器端通过将生成的HTML(可以包括js)输出到输出流中作为客户端请求的响应,所以想要客户端执行脚本就必须把脚本输出到客户端。
    2、这个问题看看这个方法的实现就知道了,实现如下: if (scriptBlocks[key] == null)
        {
            scriptBlocks.Add(key, script);意思是,当这个key不存在的时候add一个,如果存在则不做任何处理,这就是为什么只执行第一个,不执行第二个,因为第二个根本没有被注册到scriptBlocks里面去。