在模态或radwindow上进行验证后继续执行事件

时间:2013-04-15 19:09:19

标签: c# asp.net postback webusercontrol radwindow

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

这些验证显示在窗口中(在本例中为Telerik RadWindow)。在这个RadWindow中,有一个Web用户控件(WUC)包含验证,如Captcha,安全代码,秘密问题等。在用户写入验证码文本或必要的验证(它意味着WUC内部的回发)之后,WUC应该继续从打开RadWindow的底部执行被解雇的事件。

我该怎么做?任何的想法?有可能吗?

1 个答案:

答案 0 :(得分: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>

很抱歉这个冗长的回答。如果能够满足您的需求,请告诉我。