2

我的 Web 表单继承了一个名为 的类MyPageMain,该类继承System.Web.UI.Page并位于App_Code文件夹中。

在这个MyPageMain类中,我创建了这个方法,用于记录和输出异常(错误消息):

public string Error(Exception pException, string pFriendlyMessage)
{
    using (BusError erro = new BusError())
    {
        int? errorId = //HERE Routine to log the error;

        StringWriter stringWriter = new StringWriter();

        using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
        {

            writer.AddAttribute(HtmlTextWriterAttribute.Class, "erroMain");
            writer.RenderBeginTag(HtmlTextWriterTag.Div); //<div>

            writer.RenderBeginTag(HtmlTextWriterTag.P); //<p>
            writer.Write(pFriendlyMessage);
            writer.RenderEndTag(); // </p>
            writer.RenderBeginTag(HtmlTextWriterTag.Small); 
            writer.Write("Event tracker:");
            writer.Write(errorId);
            writer.RenderEndTag(); 

            writer.RenderEndTag(); // </div>
            Console.WriteLine(stringWriter.ToString());
        }

    }
}

然后,当页面出现异常时,我调用它,如下所示:

    Protected void btnLoad_Click(object sender, EventArgs e)
    {
         LoadData();
    }        

    private void LoadData()
    {
        try
        {
             //Loading some data here.
        }
        catch (Exception ex)
        {
             Error(ex, "Unexpected error trying to load data.");
        }
    }

这很好,但不起作用......我认为原因之一可能是整个事情都在UpdatePanel内。关于如何使这项工作的任何建议?

Console.Writeline适合我想做的事情吗?这适用于 UpdatePanels 吗?

已经尝试过Response.Write(...),它确实有效。但不在一个UpdatePanel

4

8 回答 8

3

当您使用 时UpdatePanel,您只能在从该面板触发的异步回发期间更新面板内的内容,因此您的错误消息必须出现在UpdatePanel. (也就是说,除非您设置UpdateMode="Always"其中一个,否则UpdatePanels它的内容会在每次异步和完整回发时更新。但这对您没有帮助,除非您将错误消息放在自己的UpdatePanelwithUpdateMode="Always"中,这需要您添加说UpdatePanel到每一页。我知道这不是你想要做的。)

以下示例将用于在UpdatePanel.

您将需要向Control errorParent您的方法添加一个参数Error,以便它可以将错误消息作为子控件添加到该父控件。

在您的catch块中,只需传入您希望出现错误消息的任何容器控件。该控件必须是接受子控件的容器,因此它必须是呈现为<div>or<span>标记的东西,例如asp:Panelor asp:UpdatePanel

在下面的示例中,您可以使用errorParent.Controls.Add(errorControl)在底部显示错误消息UpdatePanel,或使用AddAt()不同的索引。只要确保索引将始终在每个页面上工作。

取一个父控件并添加一个新的Literal子控件:

public string Error(Exception pException, string pFriendlyMessage, Control errorParent)
{
    using (BusError erro = new BusError())
    {
        int? errorId = //HERE Routine to log the error;

        Literal errorControl = new Literal();
        errorControl.Text = String.Format("<div class=\"errorMain\"><p>{0}</p><small>Event Tracker: {1}</small></div>", pFriendlyMessage, errorId);
        errorParent.Controls.AddAt(0, errorControl);
    }
}

传入父控件:

private void LoadData()
{
    try
    {
         //Loading some data here.
    }
    catch (Exception ex)
    {
         Error(ex, "Unexpected error trying to load data.", MyUpdatePanel.ContentTemplateContainer);
    }
}
于 2011-08-07T06:02:46.630 回答
2

由于您的 Error 方法返回字符串,因此您可以返回错误消息并显示它。

将 Literal 放置在 UpdatePanel 中(可能在 MasterPage 中,因此您不必为所有 40 个或更多页面编写它)。抛出异常时,使用您的 Error 方法处理它并将返回的消息设置为 Literal。

Console.WriteLine 在 ASP.NET 中不可用。请改用Debug.WriteLine。它将写入 VisualStudio 中的输出窗口。

于 2011-08-03T18:39:28.273 回答
2

许多答案都围绕着这个问题。 Console.WriteLine是用于为控制台应用程序(命令行)输出一行文本的命令。这是一个网络应用程序。因此,您要么使用Response.Write将字符串吐出到响应流,要么设置页面上已经存在的 Literal 控件的文本并将其设置为可见(默认隐藏)。

由于我自己完全错过了UpdatePanel细节,这里有一个替代解决方案来弥补它。我的示例通过使用 ScriptManager 控件使用隐藏div和一些 jQuery 将文本注入divUpdatePanel. 根据go_Click按钮的处理程序方法的条件,它将使用 jQuery 显示或隐藏一条错误消息,该消息在UpdatePanel更新时注入到 Page 服务器端。

请注意,在使用 AJAX 时,使用 ScriptManager 的函数来注册 JavaScript 而不是 Page.ClientScript 至关重要。使用后者不会将 JS 添加到页面中。

页面标记

<div id="errorMessagePlaceHolder" class="error" style="display:none;">
</div>
<asp:UpdatePanel ID="myPanel" runat="server">
    <ContentTemplate>
        <asp:TextBox ID="myText" runat="server" />
        <asp:Button ID="go" Text="GO" runat="server" OnClick="go_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

页面代码隐藏

public partial class _Default : Page {
    protected void go_Click(object sender, EventArgs e) {
        try {
            // Do something that can throw an exception

            // Hide the error if we reach the end as we may have triggered
            // it in a prior update and no longer want it to display.
            HideError();
        } catch (Exception) {
            ShowError("myText is empty!");
        }
    }

    #region Move to a base page or a helper class if it helps reduce duplication

    private void HideError() {
        ScriptManager.RegisterStartupScript(Page, GetType(), "HideErrorMessageScript", HideErrorMessageScript(), true);
    }

    private void ShowError(string errorMessage) {
        ScriptManager.RegisterStartupScript(Page, GetType(), "ErrorMessageScript", ErrorMessageScript(errorMessage), true);
    }

    private static string HideErrorMessageScript() {
        return @"
$(document).ready(function() {
    $('#errorMessagePlaceHolder').hide();
});
";
    }

    private static string ErrorMessageScript(string errorMessage) {
        return
            string.Format(
                @"
$(document).ready(function() {{
    $('#errorMessagePlaceHolder').html('{0}');
    $('#errorMessagePlaceHolder').show();
}});
",
                errorMessage);
    }

    #endregion

}
于 2011-08-07T02:52:40.893 回答
2

我觉得还没有人真正回答过整个问题,所以让我试试。

这个 Console.Writeline 是否适合我想要做的事情?

可能不会,除非您只想在调试时在输出窗口中显示调试信息。有些人喜欢继续向控制台输出信息,即使在发布版本中也是如此,因此如果您想对错误执行此操作,这是一个有效的选择,但您还应该向用户显示友好的错误消息和/或记录某种持久性的错误(例如日志文件)。上面的所有答案都是建议您向用户显示错误通知的方法。

这适用于 UpdatePanels 吗?

如果您的触发器等设置正确(我们知道它们是因为您说您能够命中Console.WriteLine断点),那么没有理由不应该这样做。我想知道您的控制台输出是否工作正常,但您在错误的地方寻找它?在 Web 应用程序的典型配置中,它应该出现在您用于调试的 Visual Studio 实例的“输出”窗口中。


至于我认为您要问的建议,即“如果加载该更新面板的内容时出错,我如何让我的错误消息出现在更新面板中?” ...

我建议采用类似于上述 nekno 提议的方法。您可以动态添加一个控件,您可以在更新面板请求处理期间将其文本设置为错误字符串,或者您甚至可以在页面上拥有一个最初隐藏/折叠的控件,该控件仅在出现错误时设置为可见. 我更喜欢后一种方法,因为它更易于维护。您可以从 ASPX 页面的标记/显示视图中完全控制错误标签的外观。

于 2011-08-10T04:41:23.930 回答
1

LoadData() 方法运行后,您是否在 UpdatePanel 上调用 .update() ?我认为除非回发来自其内部,否则 UpdatePanel 不会自动触发。

前任:

Protected void btnLoad_Click(object sender, EventArgs e)
{
    LoadData();
    MyUpdatePanel.Update(); 
} 

更新:通过为将创建错误的按钮注册这样的触发器,我能够Response.Write()在 UpdatePanel 中工作。<Triggers><asp:PostBackTrigger ControlID="btn1" /></Triggers>

于 2011-07-20T18:59:17.750 回答
1

您是否尝试记录错误或显示错误?如果您尝试显示它们,您应该:

在您的母版页上,创建一个显示错误的位置(可能在导航栏下方或底部附近:

<asp:ContentPlaceHolder id='cphError'></asp:ContentPlaceHolder>

每次遇到错误时,都可以按原样调用错误函数,但不必使用 Response.Write() 或 Console.WriteLine() 写出文本,而是可以在其中添加标签:

Label lError = new Label();
lError.CssClass = '..';
lError.Text = '..';
cphError.Controls.Add(lError);

这将帮助您显示错误,但 AJAX 仍然是一个问题。此时,您有两个选择:

  1. 由于更新面板会更新其他更新面板,因此您可以将更新面板包裹起来cphError,这样您的 AJAX 调用仍将更新该区域

  2. OR:您可以使用ClientScript.RegisterStartupScript创建错误标签。(仅当您没有静态错误消息点时,此方法才更可取)

于 2011-08-08T04:33:18.923 回答
1

在 master 上放置一个 Panel,使用 AjaxToolKit 中的 modalpopupextender 扩展它。出现错误时,将字符串写入器的内容写入面板中的标签 Eg Label lbl = (Label)Master.FindControl() lbl.text = StringWriter.ToString();

// 现在访问模态弹出框 AjaxControlToolkit.ModalPopupExtender MPE = (AjaxControlToolkit.ModalPopupExtender)Master.findControl(""); // 并显示它 MPE.Show();

Modal 需要一个隐藏按钮来用作它的目标控件,但它不需要用户输入。我使用以下代码在页面上完成此操作:

            <asp:Button ID="btnDummyOK" runat="server" Style="display: none;" />
        <asp:ModalPopupExtender ID="mpePnlErrors" runat="server" TargetControlID="btnDummyButton" PopupControlID="pnlErrirs" BackgroundCssClass="modalBackground" CancelControlID="btnCancel" OkControlID="btnOK" />

祝你好运

于 2011-08-08T20:01:09.003 回答
0

我认为 Console.WriteLine 在 asp.net 应用程序上不起作用,我认为在更新面板中你可以简单地触发 throw New Exception(友好的错误消息),它会出现在一个警告框中。

于 2011-08-03T18:35:33.027 回答