2011-06-30 51 views
16

我试图按下图所示激活弹出窗口,但它不起作用。请帮助使用Page.ClientScript.RegisterClientScriptBlock不起作用

public void btnSubmit_Click(Object o, EventArgs e) 
{ 
    if (checkFileExists(Convert.ToString(fileInfo))) 
    { 
     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type=\"text/javascript\" language=\"javascript\">function showMsg(){return confirm(\"This image name already exists, do you want to replace it?\");}</script>", true); 
     btnSubmit.OnClientClick = "return showMsg()"; 
    } 
    if (something else) 
    { 
     // It does whatever is here but never pops the question above 
    } 
} 

,按钮上我有

<asp:Button class="Button" ID="btnSubmit" CausesValidation="True" Text="SUBMIT" runat="server" 
      OnClick="btnSubmit_Click"></asp:Button> 
+0

在我的情况下,它是行不通的,因为函数原型在我的剧本是错误的缺失'(arg,context)'来自函数签名。希望它有助于某人。 –

回答

17

您向RegisterClientScriptBlock最后一个参数是true,它告诉方法来包装你的脚本在<script>块,但你”现在已经这样做了。它可能不工作,因为它呈现无效(即嵌套)脚本标记。

+0

我将它改为false,但它仍然忽略它,它不会弹出。我甚至拿出if条件强制它运行,但没有,它只是继续与“提交”并完成..从来没有触发btnSubmit.OnClientClick =“返回ShoeMsg()”; – user710502

+0

当你查看你的页面源代码时,你看到'

5

更新的响应(响应OP的评论)

整个“你确定”模式可以在ASP.NET实现一个有点讨厌。这是我用来解决它的一种方法。我相信还有很多其他方法可以实现这一点,其中一些更加优雅。但无论如何...

  • 把asp:Hidden字段放在您的表单中,以表明“用户确定”。将其默认值设置为false。
  • 直接在.ASPX文件中定义您的showMsg()javascript函数。它可以始终在页面上,准备开火;您不需要或不需要通过RegisterClientScript有条件地添加它。如果用户确认“是,我确定”,您还需要增强该功能以执行两项操作:a)将asp:Hidden字段的值设置为true; b)提交表格。
  • 实现你的btnSubmit_Click()函数来检查asp:Hidden值:如果该值为true,那么你知道用户已经确认了“你确定”对话框,这样你就可以执行你的操作了(并且隐藏的值返回以“重置”它为假)。如果asp:Hidden值为false,则触发RegisterClientScript调用(不定义,但实际调用)showMsg()函数。
  • 实施Page_LoadComplete检查隐藏的价值:如果这是真的,编程调用btnSubmitClick()

通过上面所做的更改,页面的行为应该是这样的:

  1. 用户点击提交,回复页面帖子。
  2. 执行btnSubmit_Click,看到隐藏字段为false,并将RegisterClientScript设置为调用showMsg()。
  3. Page_LoadComplete看到隐藏的字段是假的,所以它什么都没做。回发完成并且页面被发送回浏览器。
  4. 浏览器解析页面,来showMsg()并运行它。这弹出了你确定的对话框。
  5. 用户在are-you-sure对话框上单击“yes”。您更新的showMsg函数检测到这一点,将隐藏字段设置为true并提交表单。页面回传。
  6. 由于表单已回发,但提交按钮没有实际点击,您的btnSubmit_Click函数不会在这里调用。
  7. Page_LoadComplete看到隐藏字段为真,因此它调用btnSubmit_Click函数。
  8. btnSubmit_Click看到隐藏字段是真实的,并且进行真正的操作。

上面的做法绝对是沉重的。如果您愿意使用ajax来决定是否需要“确定”,那么您可以将更多逻辑移至客户端,并为自己节省回发操作。

但是,如果你提出了一些很好的建议,那么上述方法将会起作用,并且会产生相对易于维护的代码。

原始响应:

上述代码,showMsg()不会被调用,直到用户点击提交按钮第二次:

  1. 按钮呈现不带的OnClientClick值。
  2. 用户单击提交按钮;页面回复。
  3. 事件处理程序在页面上放置“function showMsg()”的定义(registerClientScript);它还将OnClientClick属性添加到按钮。回传完成并且页面在浏览器上重新绘制。
  4. 在这一点上,showMsg()并没有被任何人调用。
  5. 用户单击提交按钮。
  6. 由于按钮现在有一个OnClientClick值,这次它应该调用showMsg。

其他的事情要考虑:

你有实际的JavaScript函数定义在你RegisterClientScript。为什么不简单地在页面上定义它(在.aspx文件中)?它永远不会伤害任何东西。在实际调用之前它不会被解雇。我不熟悉你使用的doubled-parens表示法:“GetType()()” - 如果它不会导致编译器错误或不抛出,它可能是不相关的。

绝对熟悉Firebug和/或Fiddler,因此您可以确切地看到呈现的HTML被发送回浏览器。它会让你的网页开发调试更容易。

+0

当我在这里发布时,GetType()()是一个错字。我在.aspx中使用了OnClientClick,但是它会给我一个JScript Object Expected错误,我想象它是因为它找不到方法..它看起来像首先用于Javascript,然后是C#代码..问题是我需要首先评估一些事情在C#中,以决定是否触发JavaScript ...我不知道该怎么办:( – user710502

+0

编辑我的答案给你一些更多的细节和可能的方法我不是说它是最好的方法,但它距离你迄今为止所做的仅仅只有几步之遥 – mikemanne

1

我明白你的问题,我建议你做下面的事情。

1 - 让您的btSubmit但在你的

public void btnSubmit_Click(Object o, EventArgs e) 
{ 
    if (checkFileExists(Convert.ToString(fileInfo))) 
    { 
     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type=\"text/javascript\" language=\"javascript\">function showMsg(){return confirm(\"This image name already exists, do you want to replace it?\");}</script>", true); 
     btnSubmit.OnClientClick = "return showMsg()"; 
    }  
} 

删除,如果(别的)。

2-使用Dialog创建一个对话框,类似于javascript确认,但带有具有自己的点击事件的asp.net按钮。

3-改变你的

return confirm(\"This image name already exists, do you want to replace it?\"); 
在你使用jQuery的对话框的逻辑第一事件的RegisterClientScriptBlock

4-在您的新按钮的新事件添加额外的逻辑:

if (something else) 
{ 
    // you´ll know the user click your confirm button already!!! 
} 

我希望这可以帮助你。

+0

有一点要记住,使用jQuery对话框:当你初始化对话框时,jQuery呈现在DOM结尾处的新标签,这是在

标签之外,也就是说,对话框中包含的任何asp:Field(或类似)元素都不会将其值反映回视图状态, Tm值atter为提交按钮,但我有一天花了很多时间试图找出为什么我的对话框中的asp:Field中的文本从未处于回发的视图状态! :) – mikemanne

+0

Upvoted这个答案,因为我喜欢2种不同的按钮方法比我在我的答案中概述的隐藏领域方法更好! – mikemanne

+0

这个SO讨论展示了确保jQueryUI元素(至少是对话框)在FORM标记内呈现的极好方式,所以提交按钮和启用ViewState的数据值可以正常工作:http:// stackoverflow。com/questions/757232/jquery-ui-dialog-with-asp-net-button-postback – mikemanne

0

FishBasketGordo感谢您指出的区别!是一个很好的帮助!

Page.ClientScript.RegisterClientScriptBlock在我做出所指出的更改(即删除标签并添加“true”作为第四个参数)之前未触发。检查没有其他脚本块反转未被触发的脚本块的更改并且脚本块具有唯一名称可能是一个好主意。

29

Page.ClientScript.RegisterClientScriptBlock不起作用的另一个原因是当页面没有服务器端表单时,例如<form id="form1" runat="server">... </form>

+1

通过添加表单标签来解决我的问题。 –

-1

早上我同样的问题,它只是工作这种方式:

Response.Write("<script type='text/javascript'>alert('" + AlerteMsg + "');</script>"); 

你的情况,你可以写你想要什么的Javascript功能!

-1

早上我同样的问题,它只是工作这种方式:

的Response.Write( “警报( '” + AlerteMsg + “');”);

在你的情况下,你可以写任何你想要的javascript!

从上面的代码..现在我需要按2次回到button..then它可以追溯到.. 任何解决方案