2009-12-17 39 views
0

有人可以看下面的代码并告诉我我做错了什么。由ScriptManager.RegisterStartupScript调用的客户端方法不能触发

for(i=0;i<=Request.Files.Count;i++) 
{ 

int percentComplete = (int)Math.Ceiling((double)(i + 1)/(double)Request.Files.Count * 100); 
string message = string.Format("{0} of {1} uploaded", i + 1, Request.Files.Count); 

ScriptManager.RegisterStartupScript(this, this.GetType(), "progress", @"do_progress("+message+","+percentComplete+");", true); 

} 

我正在尝试每次循环更新客户端。在客户端(在表单标签内),我有一个名为“do_progress”的函数,它带有两个参数:message和percent。我的意图是,客户端方法随着循环的每个循环而激发,但没有任何反应。

UPDATE

感谢您的帮助。 Ramiz,你的代码在我的情况下不起作用,因为它收集循环内的所有方法(和进度),然后同时将它们发送给客户端。 这不会准确显示进度(每个循环代表已上传文件的完成情况)。我需要在服务器端循环的每次唯一完成之后访问客户端函数do_progress。

此外,页面已经加载,并在单击(上传)按钮时的代码被激发。

话虽如此,我仍然有问题。我可以证实,我通过看“选择来源”得到我想用下面的代码的结果:

int percentComplete = (int)Math.Ceiling((double)(i + 1)/(double)Request.Files.Count * 100); 

string message = string.Format("{0} of {1} uploaded", i + 1, Request.Files.Count); 

ScriptManager.RegisterStartupScript(this, this.GetType(), "progress" + i, @"do_progress('" + message + "','" + percentComplete + "');", true); 

但是,我没有看到实时的客户端上的结果更新。进度条不移动,计数器(n个文件中的n个)没有任何操作。但是,当我看着innerHTML时,值已经更新了。很奇怪。这几乎就像我需要刷新页面或其他东西,但这不应该是必要的。

客户端功能我用的,这是摆在表单标签页面的最后,是这样的:

function do_progress(message,percent) 
        { 
         try { 
          $('progress_status').innerHTML = message; 
          $('progress_bar').attr("style", percent + "px"); 
         }catch(e){alert(e.message)}; 
        } 
+0

尝试RegisterClientScriptBlock而不是RegisterStartupScript – 2009-12-17 07:39:20

+0

无论你是要在页面加载或点击事件... – 2009-12-17 07:44:08

回答

0

messagestring值应该封闭在单引号"do_progress('"+message+"',"+percentComplete+");"

percentComplete包含integer所以它不需要附上单引号message呢。

string methods = string.empty; 

for(i=0;i<=Request.Files.Count;i++) 
{ 

int percentComplete = (int)Math.Ceiling((double)(i + 1)/(double)Request.Files.Count * 100); 
string message = string.Format("{0} of {1} uploaded", i + 1, Request.Files.Count); 

methods += "do_progress('"+message+"','"+percentComplete+"');" 

} 

其次,在这里,我递增的所有方法在string变量,把它在window.onload事件只是确保DOM准备就绪,我们称之为do_progress功能之前。

ScriptManager.RegisterStartupScript(this, this.GetType(), "progress", @"window.onload = function() {"+ methods +"}", true); 

但是,这不应该要求在这里,在window.onload调用为ScriptManager.RegisterStartupScript会叫他们时DOM准备好。

我不确定到底是什么问题,但这是我的即时审查。

+0

谢谢,我已经更新了我的问题作出回应... – 2009-12-17 19:52:33

0

尝试使用,而不是ScriptManager.RegisterStartupScript

+0

谢谢,我试过了,但它似乎并不重要 – 2009-12-17 20:15:40

0

你的客户端do_progress功能似乎有一个错误在jQuery选择this.RegisterStartupScript - 你目前正在寻找元素命名progress_statusprogress_bar当我怀疑你打算寻找课程或ID。如果你的选择器不匹配任何东西,它不会引发任何错误,它只是不会做任何事情。