创建和显示动态错误消息(在UpdatePanel中不工作)



我的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

当您使用UpdatePanel时,您只能在从该面板触发的异步回发期间更新面板内的内容,因此您的错误消息将不得不出现在UpdatePanel中的某个地方。(也就是说,除非您将UpdateMode="Always"设置在UpdatePanels上,否则它的内容将在每次异步和完整回发时更新。但是这在这里没有帮助,除非您将错误消息与UpdateMode="Always"一起放在UpdatePanel中,这将要求您将所述UpdatePanel添加到每个页面。我明白这是不是你想做的。)

下面的示例将在UpdatePanel的顶部添加错误消息。

你需要在你的Error方法中添加一个Control errorParent参数,这样它就可以将错误信息作为子控件添加到父控件中。

在您的catch块中,只需传递您希望出现错误消息的任何容器控件。该控件必须是一个接受子控件的容器,所以它必须呈现为<div><span>标签,如asp:Panelasp: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);
    }
}

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

在你的UpdatePanel中放置文字(也许在MasterPage中,所以你不必为所有40个或更多的页面写它)。当抛出异常时,使用Error方法处理它,并将返回的消息设置为Literal。

控制台。WriteLine在ASP.NET中不可用。使用调试。WriteLine代替。它将写入VisualStudio的输出窗口。

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

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

请注意,使用ScriptManager的函数来注册JavaScript而不是Page是非常重要的。使用AJAX时的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
}

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

这是控制台吗?Writeline适合我想做什么?

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

这将在UpdatePanels上工作吗?

如果你的触发器和类似的设置正确(我们知道它们是正确的,因为你说你可以点击控制台),没有理由不这样做。WriteLine 断点)。我想知道你的控制台输出是否工作正常,但你在错误的地方寻找它?在web应用程序的典型配置中,它应该出现在用于调试的Visual Studio实例的输出窗口中。

关于我认为你要问的建议,这是"如果加载更新面板的内容出错,我如何让我的错误信息出现在更新面板中?"

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

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

,

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

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

是记录错误还是显示错误?如果你想显示它们,你应该:

在你的主页上,创建一个显示错误的地方(可能在你的导航栏下面或靠近底部):

<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来创建错误标签。(此方法仅在没有静态错误消息点时更可取)

在主面板上放置一个面板,用AjaxToolKit中的modalpopupextender扩展它。当抛出错误时,将字符串写入器的内容写入面板中的标签,例如label lbl = (label)Master.FindControl()lbl。

//现在进入模式弹出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" />

祝你好运

我想控制台。WriteLine不工作在asp.net应用程序,我认为在一个更新面板内,你可以简单地触发抛出新的异常(友好的错误信息),它将出现在一个警告框

相关内容

  • 没有找到相关文章

最新更新