【问题标题】:ASP.NET C# Open multiple modal popup inside loop, one by oneASP.NET C#在循环内打开多个模式弹出窗口,一一
【发布时间】:2016-05-18 13:14:52
【问题描述】:

我有一个GridView(Telerik 的RadGridView)和一个用于多行选择的CheckBox 列。每行代表一个文档,我需要能够选择多个文档以对其应用数字签名。

实际上,如果只选择了一个文档,我会在弹出窗口中打开一个新的 aspx 页面,该页面会调用 DigitalSignature 服务(侦听特定端口的 Web 应用程序),该服务会打开一个 Wacom 屏幕,等待 Wacom 平板电脑上的签名.当用户签名或关闭窗口时,弹出关闭和GridView 更新。

我需要在每个选定行的 foreach 循环中执行此操作。 问题是现在我用唯一的名称调用ScriptManager.RegisterStartupScript,但它们同时打开,但我想一个一个打开。

可能不使用 jQuery 或 3rd 方库。

我正在使用 .NET Framework v3.5。

实际代码:

foreach (SelectedDocument selectedDoc in SelectedDocuments)
{
    Documento doc;

    try
    {
        // Open document
        doc = session.Load<Document>(Convert.ToInt64(selectedDoc.ID));

        if (doc != null)
        {
            // Get the file...

            // Do some stuff...

            // Set query string         
            string queryString = string.Format("Sign.aspx?fileNameToSign={0}&reader={1}&view={2}&docid={3}&userid={4}",
                                    pathQueryString, certificate, "0", selectedDoc.ID, UserId);

            string urlDownload = Page.ResolveClientUrl(string.Format("~/Path/To/Folder/{0}", queryString));

            string script = string.Format("loadDownload('{0}','_blank',600,600);", urlDownload);

            // Open Wacom window
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "DocID" + selectedDoc.ID, script, true);
        }
    }
}

【问题讨论】:

    标签: c# asp.net foreach popup modal-dialog


    【解决方案1】:

    为什么不设置一个开关检查来查看文档是否已签名,在循环进入下一个文档之前,它应该等待(使用await 继续循环)

    查看示例:

    首先创建一个帮助方法来生成一个在单击按钮时将完成的任务:

    public static Task WhenClicked(this Button button)
    {
        var tcs = new TaskCompletionSource<bool>();
        EventHandler handler = null;
        handler = (s, e) =>
        {
            tcs.TrySetResult(true);
            button.Click -= handler;
        };
        button.Click += handler;
        return tcs.Task;
    }
    

    之后,您可以轻松地等待 2 秒(或更长时间)过去,或者单击按钮:

    public  async void Bar()
    {
        this.button.Focus();
    
        this.button.BackColor = Color.Green;
    
        await Task.WhenAny(Task.Delay(2000), button.WhenClicked());
    
        // now the loop continues and the button changes its color
        this.button.BackColor = Color.White;
    }
    

    【讨论】:

    • 感谢以下 NuGet 包,您可以将 async/await 的强大功能和简单性带到您的旧应用程序中: Microsoft Async 此包使 Visual Studio 2012 项目能够使用新的 'async' 和 'await '关键词。这个包还包括基于任务的扩展方法,允许使用一些现有的异步 API 和新的语言关键字。 Windows Phone Silverlight 8 项目可以使用这个包来访问网络类型的异步扩展方法。
    • 抱歉耽搁了。我不能使用第 3 方库(甚至来自 MS),因为该项目是 ASP.NET 应用程序的 WebPart,因此未经批准和测试我无法将其他库添加到项目中。
    • 试试看,也许你的老板会认可你,试一试,看看他们怎么说。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2011-02-16
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多