我的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:Panel
或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);
}
}
由于您的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适合我想做什么?
可能不会,除非您只是想在调试时在输出窗口中显示调试信息。有些人喜欢继续向控制台输出信息,即使是在发布版本中,所以如果你想对你的错误这样做,这是一个有效的选择,但你也应该向用户显示一个友好的错误信息和/或将错误记录到某种持久性(例如。日志文件)。以上所有的答案都是建议您向用户显示一些错误通知的方法。
如果你的触发器和类似的设置正确(我们知道它们是正确的,因为你说你可以点击控制台),没有理由不这样做。WriteLine 断点)。我想知道你的控制台输出是否工作正常,但你在错误的地方寻找它?在web应用程序的典型配置中,它应该出现在用于调试的Visual Studio实例的输出窗口中。这将在UpdatePanels上工作吗?
关于我认为你要问的建议,这是"如果加载更新面板的内容出错,我如何让我的错误信息出现在更新面板中?"…
我建议采用与上面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仍然是一个问题。此时,您有两个选项:
由于更新面板更新其他更新面板,您可以在
cphError
周围包装一个更新面板,这样您的AJAX调用仍然会更新该区域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应用程序,我认为在一个更新面板内,你可以简单地触发抛出新的异常(友好的错误信息),它将出现在一个警告框