不能让ScriptManager.RegisterStartupScript在件网络控件嵌套在UpdatePanel工作
-
03-07-2019 - |
题
我有什么我认为应该是一个相当简单的问题,但是对于我的生活我不能看到我的问题。问题是相关的ScriptManager.RegisterStartupScript的东西我已经使用多次。
的情景,我有,我有一个定义的网的控制,已经插入一个网页。控制(以及一个或两个其他人)都嵌套内部UpdatePanel.他们是插入到该网页上的占位:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
这是唯一的更新小组的网页。
控制需要一些初步javascript能运行它的正常工作。控制话:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
并且我也试过:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
问题是,脚本以正常运行时,该网页是第一个显示的,但不再运行之后的部分回发。我试图如下:
- 叫RegisterStartupScript从CreateChildControls
- 叫RegisterStartupScript从加载/OnPreRender
- 使用的不同组合参数的第一两个参数(在上面的例子控制的页面和种类是GetType(),但是我已经尝试使用的控制本身等)。
- 我已经尝试使用持久的和新的身份证(不是我认为,这应该有重大影响的任何一方式)。
- 我用几个断点和所以验证登记册线是正确的。
我唯一没有尝试过被使用UpdatePanel本身作为控制和类型,因为我不相信的控制应该知道的更新小组(而且在任何情况下似乎没有是一个很好的方式得到更新,小组?).
任何人都可以看看有什么我可能做错了在上面?
谢谢:)
为了回答上述查询的-它不会出现如同占位以某种方式混乱ScriptManager.RegisterStartupScript.
当我拉的控制的占位和代码,它直接到该网页注册脚本正常工作(我也使用控制本身作为一个参数)。
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
任何人都可以把任何为什么一个注入的控制上的占位将防止ScriptManager从正确登记的剧本吗?我猜这可能有一些与生命周期中的动态的控制,但希望(为我自己的知识)如果有一个正确的进程。
解决方案
我想你确实应当使用 控制过载 的RegisterStartupScript.
我已经试过了下列代码在一个服务器的控制:
[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")]
public class AlertControl : Control{
protected override void OnInit(EventArgs e){
base.OnInit(e);
string script = "alert(\"Hello!\");";
ScriptManager.RegisterStartupScript(this, GetType(),
"ServerControlScript", script, true);
}
}
然后在我的网页我有:
protected override void OnInit(EventArgs e){
base.OnInit(e);
Placeholder1.Controls.Add(new AlertControl());
}
在Placeholder1是一个占位于一个更新的小组。占位有一些其他的管制,包括按钮。
这表现,正是因为你期望我得到一个警告说"你好"每次我加载的页或引起的更新,小组更新。
其他的事情你可以看看是钩到的一些页面的生命周期的事件期间发射的一个更新小组的请求:
Sys.WebForms.PageRequestManager.getInstance()
.add_endRequest(EndRequestHandler);
的 PageRequestManager endRequestHandler 事件时更新小组完成其更新-这会让你呼叫一个方法设置控制。
我唯一的其他问题有:
- 什么是你的脚本实际上在做什么?
- 大概是你可以看到剧本的HTML在页底部(前刚刚关闭 </form> 标签)?
- 你有没有试图把几个"alert("这里");"的电话在你的启动脚本,看看它是否被叫做正确?
- 你有没有尝试过火狐, 萤火虫 -是,报告任何脚本中的错误?
其他提示
我在用户控件中使用它时出现了问题(在这个页面中工作正常); Button1位于updatepanel
中,scriptmanager
位于usercontrol
。
protected void Button1_Click(object sender, EventArgs e)
{
string scriptstring = "alert('Welcome');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertscript", scriptstring, true);
}
现在看来你必须要小心前两个参数,他们需要引用你的页面而不是你的控件
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alertscript", scriptstring, true);
当您调用ScriptManager.RegisterStartupScript时,<!> quot; Control <!> quot;参数必须是将更新的UpdatePanel中的控件。您需要将其更改为:
ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), script, true);
解决方案是将脚本放在外部js文件中(我们称之为'yourDynamic.js')并在每次刷新updatepanel时重新注册de file。
我在updatepanel_prerender事件中使用它:
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "UpdatePanel1_PreRender", _
"<script type='text/javascript' id='UpdatePanel1_PreRender'>" & _
"include('yourDynamic.js');" & _
"removeDuplicatedScript('UpdatePanel1_PreRender');</script>" _
, False)
在页面或其他一些内容中,您需要使用此javascript:
// Include a javascript file inside another one.
function include(filename)
{
var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script');
for(var x=0;x<scripts.length;> {
if (scripts[x].getAttribute('src'))
{
if(scripts[x].getAttribute('src').indexOf(filename) != -1)
{
head.removeChild(scripts[x]);
break;
}
}
}
script = document.createElement('script');
script.src = filename;
script.type = 'text/javascript';
head.appendChild(script)
}
// Removes duplicated scripts.
function removeDuplicatedScript(id)
{
var count = 0;
var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script');
var firstScript;
for(var x=0;x<scripts.length;> {
if (scripts[x].getAttribute('id'))
{
if(scripts[x].getAttribute('id').indexOf(id) != -1)
{
if (count == 0)
{
firstScript = scripts[x];
count++;
}
else
{
head.removeChild(firstScript);
firstScript = scripts[x];
count = 1;
}
}
}
}
clearAjaxNetJunk();
}
// Evoids the update panel auto generated scripts to grow to inifity. X-(
function clearAjaxNetJunk()
{
var knowJunk = 'Sys.Application.add_init(function() {';
var count = 0;
var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script');
var firstScript;
for(var x=0;x<scripts.length;> {
if (scripts[x].textContent)
{
if(scripts[x].textContent.indexOf(knowJunk) != -1)
{
if (count == 0)
{
firstScript = scripts[x];
count++;
}
else
{
head.removeChild(firstScript);
firstScript = scripts[x];
count = 1;
}
}
}
}
}
非常酷,啊...... jejeje
我前段时间发布的这部分内容
我遇到了Page.ClientScript.RegisterStartUpScript的问题 - 我没有使用更新面板,但控件已缓存。这意味着我必须将脚本插入Literal(或者可以使用PlaceHolder),因此当从缓存中呈现时,脚本就会被包含在内。 类似的解决方案可能适合您。
请勿使用GUID for Key
ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel)
Guid.NewGuid().ToString(), myScript, true);
如果你想这样做,请调用Something Like this function
public static string GetGuidClear(string x)
{
return x.Replace("-", "").Replace("0", "").Replace("1", "")
.Replace("2", "").Replace("3", "").Replace("4", "")
.Replace("5", "").Replace("6", "").Replace("7", "")
.Replace("8", "").Replace("9", "");
}
对我有用的是,在将页面指定为UpdatePanel的类型时将其注册到页面上,如下所示:
ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel) Guid.NewGuid().ToString(), myScript, true);
当脚本出现语法错误时,有时它不会触发,请确保脚本和javascript语法正确。
ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(),script, true );
<!> quot; true <!> quot; ScriptManager末尾的参数值.RegisterStartupScript将在页面中添加JavaScript标记:
<script language='javascript' defer='defer'>your script</script >
如果值为<!>“; false <!>”;它只会注入带有--script--标记的脚本。
我尝试了很多东西,最后发现最后一个参数必须为false,你必须将<SCRIPT>
标签添加到java脚本中:
string script = "< SCRIPT >alert('hello!');< /SCRIPT>";
ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), key, script, **false**);