我有一个图像按钮声明为,
<div>
<asp:ImageButton ID="btnDoWork" runat="server" ImageUrl="/_LAYOUTS/1033/IMAGES/row.png" ValidationGroup="Page" />
</div>
<div>
<asp:RequiredFieldValidator runat="server" ID="reqName" ControlToValidate="txtEmail" ValidationGroup="Page" ErrorMessage="enter a email" />
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ValidationExpression="^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$" ControlToValidate="txtEmail" ValidationGroup="Page" ErrorMessage="enter a email" />
</div>
在更新面板中,
现在代码背后我正在做这样的事情,
btnDoWork = (ImageButton)this.control.FindControl("btnDoWork"); //this code is in childcontrols method
btnDoWork.Click += new ImageClickEventHandler(btnDoWork_Click);
然后
protected void btnDoWork_Click(object sender, ImageClickEventArgs e)
{
//Process a bit of code and at end,
this.Page.Unload += new EventHandler(Page_Unload_MessageBox);
然后在按钮点击事件中
public static void Page_Unload_Page_Unload_MessageBox(object sender, EventArgs e)
{
System.Globalization.CultureInfo _culture = Thread.CurrentThread.CurrentUICulture;
StringBuilder sb = new StringBuilder();
sb.Append("<script language=\"javascript\">");
sb.Append("$('body').append(\"<div id='M'><span id='text'>" +
SPUtility.GetLocalizedString("$Resources:abc", "def", (uint)_culture.LCID) +
"</span><br/><div id='BB' onclick='return BB();'><a href='' onclick='return BB();'>" +
SPUtility.GetLocalizedString("$Resources:OK", "def", (uint)_culture.LCID) +
"</a></div></div>\");");
sb.Append("function BB() { $('#M').remove(); $('#E').remove(); return false; }");
sb.Append("function dM(){ var browser = navigator.appName; if (browser == 'Netscape') { $('#M').css({ 'top': '5%' }, 500); } }");
sb.Append("</script>");
// Write the JavaScript to the end of the response stream.
HttpContext.Current.Response.Write(sb.ToString());
现在,如果我将电子邮件地址设置为错误,而我在尝试Response.Write
时会发现错误,我想知道有什么替代方案,例如我可以在更新面板或任何其他事件或其他事件中使用触发器..
这是我现在得到的错误,
注意:我更改了所有变量名称,所以如果不匹配则不要混淆
答案 0 :(得分:0)
消息非常清楚,您无法在更新面板上添加此命令HttpContext.Current.Response.Write
,因为无法知道如何处理它,因为更新面板返回javascript使用的结构重新绘制页面的某些部分。
解决方案是在UpdatePanel中添加一个文字控件,在您希望添加额外html代码的位置,并将该控件写为:
txtLiteralID.Text = sb.ToString();
然而,在这里,你有不同于正常的情况,你赢得了渲染和运行一个脚本。
主要问题是如何触发脚本运行。唯一的方法是使用UpdatePanel处理程序,即此标准代码:
<script type="text/javascript">
// if you use jQuery, you can load them when dom is read.
$(document).ready(function () {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
});
function InitializeRequest(sender, args) {
}
function EndRequest(sender, args) {
// after update occur on UpdatePanel run the code.
UnloadMsgBox();
}
</script>
现在在EndRequest
上你需要调用你的脚本,它可能在你的代码中被读取为:
function UnloadMsgBox()
{
// render your code of the javascript.
$('body').append(\"<div id='M'><span id='text'></span><br/><div id='BB' onclick='return BB();'><a href='' onclick='return BB();'></a></div></div>\");
function BB() { $('#M').remove(); $('#E').remove(); return false; }"
function dM(){ var browser = navigator.appName; if (browser == 'Netscape') { $('#M').css({ 'top': '5%' }, 500); } }"
}
并且不需要在UpdatePanel上呈现它。
总结:
Response.Write
渲染除了文字控件之外的内容,而是在其中呈现。答案 1 :(得分:0)
MS Ajax调用执行整页渲染,计算原始差异,将差异发送到客户端,并在浏览器中神奇地合并差异。
如果你只是发送javascript作为响应,它就是框架不期望的东西,它会抛出消息。
请参阅previous answer,了解如何从UpdatePanel调用javascript。