0

我有以下场景: 用户单击 asp 页面内的按钮。由于安全原因,在单击事件执行期间,系统确定有必要在继续执行触发的事件之前应用一些验证。

这些验证显示在一个窗口中(在本例中为 Telerik RadWindow)。在此 RadWindow 内,有一个 Web 用户控件 (WUC),其中包含验证码,或安全代码、秘密问题等。在用户编写验证码文本或必要的验证(这意味着 WUC 内的回发)后,WUC应该继续从打开 RadWindow 的按钮执行触发的事件。

我怎样才能做到这一点?任何想法?可能吗?

4

1 回答 1

1

当您调用 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>

对不起,冗长的回答。让我知道这是否能满足您的需求。

于 2013-04-15T21:23:57.057 回答