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.");
        }
    }

これは問題ありませんが、機能しません...理由の1つは、すべてがUpdatePanel内にあるという事実である可能性があると思います。これを機能させる方法について何か提案はありますか?

これはConsole.Writeline私がやろうとしていることに適していますか? これは UpdatePanels で機能しますか?

すでに試してみましたがResponse.Write(...)、うまくいきます。しかし、内部ではありませんUpdatePanel

4

8 に答える 8

3

を使用するUpdatePanelと、そのパネルからトリガーされた非同期ポストバック中にパネル内のコンテンツのみを更新できるため、エラー メッセージはUpdatePanel. (つまり、のいずれかUpdateMode="Always"に設定しない限りUpdatePanels、そのコンテンツはすべての非同期および完全なポストバックで更新されます。ただし、エラーメッセージを で独自に配置しない限り、ここでは役に立ちませUpdatePanelUpdateMode="Always"。これがあなたのやりたいことではないUpdatePanelことは理解しています。)

次の例では、エラー メッセージを の先頭に追加しますUpdatePanel

Control errorParentメソッドにパラメーターをError追加して、エラー メッセージを子コントロールとしてその親コン​​トロールに追加できるようにする必要があります。

ブロック内で、catchエラー メッセージを表示するコンテナー コントロールを渡すだけです。そのコントロールは、子コントロールを受け入れるコンテナーでなければならないため、 or のように or タグとしてレンダリングされるものでなければなり<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);
    }
}
于 2011-08-07T06:02:46.630 に答える
2

まだ誰も質問に答えていないような気がするので、やってみます。

このConsole.Writelineは、私がやろうとしていることに適していますか?

デバッグ中にデバッグ情報を出力ウィンドウに表示したい場合を除いて、おそらくそうではありません。リリースビルドでもコンソールに情報を出力し続けることを好む人もいるので、エラーでそれを実行したい場合は、それは有効な選択ですが、ユーザーやログにわかりやすいエラーメッセージを表示する必要もありますある種の永続性(ログファイルなど)に対するエラー。上記のすべての回答は、エラーの通知をユーザーに表示する方法を提案しています。

これはUpdatePanelsで機能しますか?

トリガーなどが適切に設定されている場合は、そうすべきではない理由はありません(Console.WriteLineブレークポイントに到達できると言ったためです)。コンソール出力は正常に機能しているのだろうかと思いますが、間違った場所で探していますか?Webアプリケーションの一般的な構成では、デバッグに使用しているVisualStudioインスタンスの[出力]ウィンドウに表示されます。


あなたが求めていると思うことの提案については、「更新パネルのコンテンツの読み込み中にエラーが発生した場合、エラーメッセージを更新パネルに表示するにはどうすればよいですか?」です。..。

上記のneknoの提案と同様のアプローチを提案します。更新パネルのリクエスト処理中にテキストをエラー文字列に設定できるコントロールを動的に追加するか、エラーの場合にのみ表示されるように設定されている、ページ上に最初に非表示/折りたたまれたコントロールを設定することもできます。 。後者の方が保守しやすいので、後者の方がいいと思います。ASPXページのマークアップ/表示ビューからエラーラベルのルックアンドフィールを完全に制御できます。

于 2011-08-10T04:41:23.930 に答える
2

答えの多くは、この問題をめぐって踊っています。 Console.WriteLineコンソール アプリケーション (コマンド ライン) のテキスト行を出力するために使用されるコマンドです。これは Web アプリです。Response.Writeそのため、文字列を Response ストリームに吐き出すか、既にページにあるリテラル コントロールのテキストを設定し、表示されるように設定します (デフォルトでは非表示)。

私自身はUpdatePanel詳細を完全に見逃していたので、それを補うための別の解決策があります. 私の例では、ScriptManager コントロールを使用して非表示の jQuery を使用し、 の外側にある にdivテキストを挿入します。ボタンのハンドラー メソッドの条件に基づいて、の更新時にページ サーバー側に挿入される jQuery を使用して、エラー メッセージを表示または非表示にします。divUpdatePanelgo_ClickUpdatePanel

AJAX を使用する場合は、Page.ClientScript ではなく、ScriptManager の関数を使用して JavaScript を登録することが非常に重要であることに注意してください。後者を使用すると、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

Error メソッドは文字列を返すため、エラー メッセージを返して表示することができます。

Literal を UpdatePanel に配置します (おそらく MasterPage に配置するため、40 ページ以上すべてに記述する必要はありません)。例外がスローされたら、Error メソッドで処理し、返されたメッセージを Literal に設定します。

Console.WriteLine は ASP.NET では使用できません代わりにDebug.WriteLineを使用してください。VisualStudio の出力ウィンドウに書き込みます。

于 2011-08-03T18:39:28.273 に答える
1

パネルをマスターに配置し、AjaxToolKitのmodalpopupextenderで拡張します。エラーが発生した場合は、文字列ライターの内容をパネルのラベルに書き込みます。例:Label lbl =(Label)Master.FindControl()lbl.text = StringWriter.ToString();

//モーダルポップアップにアクセスしますAjaxControlToolkit.ModalPopupExtenderMPE=(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 に答える
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 にはまだ問題があります。この時点で、次の 2 つのオプションがあります。

  1. 更新パネルは他の更新パネルを更新するため、更新パネルをラップすることができcphErrorます。このようにして、AJAX 呼び出しはその領域を更新します。

  2. または:ClientScript.RegisterStartupScriptを使用して、エラー ラベルを作成できます。(この方法は、静的なエラー メッセージ スポットがない場合にのみ推奨されます)

于 2011-08-08T04:33:18.923 に答える
0

Console.WriteLine は asp.net アプリケーションでは機能しないと思います。更新パネル内で新しい例外をスローするだけで (わかりやすいエラー メッセージ)、アラート ボックスに表示されると思います。

于 2011-08-03T18:35:33.027 に答える