0

我有一个网站,其中包含一个代码隐藏文件和一个单独的类,该类的功能需要很长时间才能完成。我想要的是在函数传递字符串时向访问者显示一些信息。

我使用委托将字符串发送回代码隐藏,如下所示:

public event Feedback feedbackInfo;
public EventArgs e = null;
public delegate void Feedback(String message, bool info);

因此,在我的函数中,我可以使用FeedbackInfo("message", true);由代码隐藏函数 setFeedback 接收的函数:

public void example() {
    new Thread(delegate()
                {
                    crypto = new EncryptNoLibraries(@"C:\Users\Robbie\TestDES\New Microsoft Visio Drawing.vsdx", @"C:\Users\Robbie\TestDES\New Microsoft Visio Drawing encrypted.vsdx");
                    crypto.feedbackInfo += new EncryptNoLibraries.Feedback(setFeedback);

                    object[] allArgs = { EncryptNoLibraries.CryptType.ENCRYPT, lstSleutels };
                    object args = allArgs;
                    crypto.DoCryptFile(args);
                }).Start();
}

public void setFeedback(String message, bool info)
{
    if (info)
    {
        if (!infoCell.Visible)
        {
            errorCell.Visible = false;
            infoCell.Visible = true;
        }
        lblInfo.Text += String.Format("- {0}<br />", message);
    }
    else
    {
        if (!errorCell.Visible)
        {
            infoCell.Visible = false;
            errorCell.Visible = true;
        }
        lblError.Text += String.Format("- {0}<br />", message);
    }
}

这是我的网页:

<%@ Page Title="Home" Async="true" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DESEncryptie._Default" %>

<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
    <script type="text/javascript">

        function updater() {
            __doPostBack('updatePanel', '');
        }
    </script>
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>DES encryptie/decryptie</h1>
            </hgroup>
            <p>
                Kies simpelweg uw bestand. Vervolgens kiest u uw sleutel en de methode van encryptie of decryptie. Als laatste kiest u de taal waarmee u wilt werken (bijv. Java of .NET).
            </p>
        </div>
    </section>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <h3>Start hier:</h3>
    <asp:UpdatePanel ID="updatePanel" runat="server">
        <ContentTemplate>
            <asp:Table runat="server" CssClass="tableStartHier">
                <asp:TableRow>
                    <asp:TableCell>Bestand:</asp:TableCell>
                    <asp:TableCell>
                        <asp:FileUpload ID="bestand" runat="server" on />
                        <i>(Probleem: bestandsnamen kunnen te lang zijn)</i>
                    </asp:TableCell>
                </asp:TableRow>
                <asp:TableRow>
                    <asp:TableCell><asp:CheckBox ID="DES" runat="server" Checked="true" TextAlign="Left"
                        Text="DES" OnCheckedChanged="DES_CheckedChanged" AutoPostBack="true" /></asp:TableCell>
                    <asp:TableCell><asp:CheckBox ID="ThreeDES" runat="server" Checked="false" TextAlign="Left"
                        Text="3DES" OnCheckedChanged="ThreeDES_CheckedChanged" AutoPostBack="true" /></asp:TableCell>
                </asp:TableRow>

                <asp:TableRow>
                    <asp:TableCell ColumnSpan="2">Sleutel:</asp:TableCell>
                </asp:TableRow>
                <asp:TableRow ID="sleutelDES" runat="server" Visible="true">
                    <asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel" runat="server" placeholder="Geef een sleutel" /></asp:TableCell>
                </asp:TableRow>
                <asp:TableRow ID="sleutelDrieDES1" runat="server" Visible="false">
                    <asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel1" runat="server" placeholder="Geef sleutel 1" /></asp:TableCell>
                </asp:TableRow>
                <asp:TableRow ID="sleutelDrieDES2" runat="server" Visible="false">
                    <asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel2" runat="server" placeholder="Geef sleutel 2" /></asp:TableCell>
                </asp:TableRow>
                <asp:TableRow ID="sleutelDrieDES3" runat="server" Visible="false">
                    <asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel3" runat="server" placeholder="Geef sleutel 3" /></asp:TableCell>
                </asp:TableRow>

                <asp:TableRow>
                    <asp:TableCell>Taal:</asp:TableCell>
                    <asp:TableCell>
                        <asp:DropDownList ID="taal" runat="server" Width="75px">
                            <asp:ListItem Text=".NET" Value=".NET" />
                            <asp:ListItem Text=".NET Libraries" Value=".NETLib" />
                            <asp:ListItem Text="Java Libraries" Value="Java" />
                        </asp:DropDownList>
                    </asp:TableCell>
                </asp:TableRow>

                <asp:TableRow>
                    <asp:TableCell><asp:Button id="encrypteer" Text="Encrypteer" runat="server" OnClientClick="setInterval(updater, 2500);" OnClick="encrypteer_Click" ToolTip="Encrypteer uw bestand" /></asp:TableCell>
                    <asp:TableCell><asp:Button id="decrypteer" runat="server" Text="Decrypteer" OnClick="decrypteer_Click" ToolTip="Decrypteer uw bestand" /></asp:TableCell>
                </asp:TableRow>

                <asp:TableRow>
                    <asp:TableCell runat="server" ID="spinner" Visible="false">
                        <asp:Image ID="imgSpinner" runat="server" ImageUrl="~/Images/spinner.gif"/>Even geduld.
                    </asp:TableCell>
                </asp:TableRow>

                <asp:TableRow ForeColor="Blue">
                    <asp:TableCell ID="infoCell" runat="server" ColumnSpan="2" Visible="false">
                        Informatieberichten tijdens het crypteren:<br />
                        <asp:Label ID="lblInfo" runat="server" Text="" />
                    </asp:TableCell>
                </asp:TableRow>

                <asp:TableRow ForeColor="Red">
                    <asp:TableCell ID="errorCell" runat="server" ColumnSpan="2" Visible="false">
                        Foutberichten tijdens het crypteren:<br />
                        <asp:Label ID="lblError" runat="server" Text="" />
                    </asp:TableCell>
                </asp:TableRow>
            </asp:Table>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

您可以看到我使用 javascript 每 2.5 秒回发一次更新我的面板。问题是当回发被触发时,标签中应该更新的文本丢失了。这里有一些图像来说明。之前是页面在第一次渲染时的样子,之后是我按下加密按钮后显示的内容。即使在 2.5 秒后,也并非所有消息都会显示(它们甚至会消失!)。

前: 在此处输入图像描述

后: 在此处输入图像描述

我究竟做错了什么?

4

2 回答 2

0

我想这是我的错,我找到了解决方案。到目前为止,我添加了两个保存消息的静态字符串变量。

private static String infoMessages = "", errorMessages = "";
public void setFeedback(String message, bool info)
{
    if (info)
    {
        if (!infoCell.Visible)
        {
            errorCell.Visible = false;
            infoCell.Visible = true;
        }
        infoMessages += String.Format("- {0}<br />", message);
        lblInfo.Text += infoMessages;
    }
    else
    {
        if (!errorCell.Visible)
        {
            infoCell.Visible = false;
            errorCell.Visible = true;
        }
        errorMessages += String.Format("- {0}<br />", message);
        lblError.Text += errorMessages;
    }
}
于 2013-11-12T17:29:55.573 回答
0

我不认为 ASP .Net 网页对象在帖子之间持续存在。它们是从您的会话存储中重新创建和填充的。

在我的代码中,我有一个应用程序全局的后台操作。我能够使用类中的一些静态成员将后台任务的进度传递给用户。

我使用 ASP 计时器来获取回发:

Timer1_Tick 方法中没有代码。只是一条评论说明 PageLoad 完成了与显示进度相关的工作。

您的情况会有点困难,因为您可以为每个浏览器实例设置一个后台任务。

如果你使用静态成员字典,以会话 id 为键,后台进程可以更新字典条目,Page_Load 可以更新用户的屏幕。

然后是会议来来去去的问题。你如何清理这样的字典?

另外,请记住 IIS 往往会在 20 分钟没有 http 请求后关闭整个网站进程。

[当我输入我的冗长答案时,你似乎自己找到了它。不错的演出!]

于 2013-11-12T17:31:48.903 回答