我有以下场景: 用户单击 asp 页面内的按钮。由于安全原因,在单击事件执行期间,系统确定有必要在继续执行触发的事件之前应用一些验证。
这些验证显示在一个窗口中(在本例中为 Telerik RadWindow)。在此 RadWindow 内,有一个 Web 用户控件 (WUC),其中包含验证码,或安全代码、秘密问题等。在用户编写验证码文本或必要的验证(这意味着 WUC 内的回发)后,WUC应该继续从打开 RadWindow 的按钮执行触发的事件。
我怎样才能做到这一点?任何想法?可能吗?
我有以下场景: 用户单击 asp 页面内的按钮。由于安全原因,在单击事件执行期间,系统确定有必要在继续执行触发的事件之前应用一些验证。
这些验证显示在一个窗口中(在本例中为 Telerik RadWindow)。在此 RadWindow 内,有一个 Web 用户控件 (WUC),其中包含验证码,或安全代码、秘密问题等。在用户编写验证码文本或必要的验证(这意味着 WUC 内的回发)后,WUC应该继续从打开 RadWindow 的按钮执行触发的事件。
我怎样才能做到这一点?任何想法?可能吗?
当您调用 RadWindow 时,请确保设置OnClientClose
事件。如果您从代码隐藏创建您的 RadWindow:
RadWindow newWindow = new RadWindow();
newWindow.OnClientClose = "onRadWindowClosed";
...
如果您通过 javascript 打开 RadWindow,则可以使用 add_close() 方法:
...
getRadWindow().add_close('onRadWindowClosed');
...
无论哪种情况,您都需要在调用页面上为 OnClientClose 事件创建一个新的事件处理程序脚本:
function onRadWindowClosed(sender, eventArgs) {
var returnValue = eventArgs.get_argument();
if (returnValue != null) {
if (returnValue == "continue") {
// Continue doing work
}
else {
// Throw an error
}
}
}
在您的 WUC 上,在btnContinue
点击事件中:
protected void btnContinue_Click(object sender, EventArgs e)
{
Page.ClientScript.RegisterClientScriptBlock(GetType(), "closeScript", "getRadWindow().close('continue');", true);
}
此功能用于两个页面:
function getRadWindow() {
var oWindow = null;
if (window.radWindow)
oWindow = window.radWindow;
else if (window.frameElement.radWindow)
oWindow = window.frameElement.radWindow;
return oWindow;
}
现有答案的更新
在您的调用页面上,添加一个函数来获取 RadAjaxManager(假设您已经在页面上。如果没有,您将需要一个):
function get_ajaxManager() {
return $find("<%= Telerik.Web.UI.RadAjaxManager.GetCurrent(this.Page).ClientID %>");
}
修改您的 OnClosed javascript 函数(来自调用页面):
function onRadWindowClosed(sender, eventArgs) {
var returnValue = eventArgs.get_argument();
if (returnValue != null) {
if (returnValue == "continue") {
// This call will invoke a server side event
get_ajaxManager().ajaxRequest("continue~");
}
}
}
在您的代码隐藏中,处理被调用的服务器端事件:
protected void RadAjaxManager1_Request(object source, Telerik.Web.UI.AjaxRequestEventArgs e)
{
try
{
if (e.Argument.Trim().Length == 0)
{
// Show a message when debugging, otherwise return
return;
}
string argument = (e.Argument);
String[] stringArray = argument.Split('~');
switch (stringArray[0])
{
case "continue":
// Continue performing your action or call a specific method
ServerSideMethodCall();
break;
}
}
catch (Exception ex)
{
RadAjaxManager.GetCurrent(this.Page).Alert("Unable to complete operation at this time: " + ex.Message);
}
}
如前所述,如果页面上还没有 RadAjaxManager,您将需要一个 RadAjaxManager,并且您需要将 AjaxRequest 处理程序绑定到它。
<telerik:RadAjaxManager runat="server" ID="RadAjaxManager1" OnAjaxRequest="RadAjaxManager1_Request"></telerik:RadAjaxManager>
对不起,冗长的回答。让我知道这是否能满足您的需求。