0

概要:
無効化された ASP.NET バリデーターは、サーバーにポストバックされるとコンテンツを失い、InnerHTML(JavaScript を介してローカルで) 有効化されると、起動時にErrorMessageオリジナルではなく表示されますInnerHTML

詳細:
他のコントロールの選択に応じて、多くの個々のコントロールを表示/非表示にし、それらのバリデーターを有効/無効にする必要がある複雑なフォームを扱います。

すべてのバリデーターには、単一の「アスタリスク」画像が含まれており、中央のasp:ValidatorSummaryオブジェクトを介してエラー メッセージが表示されます。たとえば(ここで表示するためにフォーマットされています。通常、空白の UPDATEはありません。これは実際には正しくありません。以下の更新を参照してください)...

<asp:RequiredFieldValidator runat="server" ID="valName" 
  ControlToValidate="txtName" ErrorMessage="Enter a name">
    <img runat="server" src="~/images/error.gif" />
</asp:RequiredFieldValidator>

asp:CustomValidatorすべてのバリデーター (それぞれにローカル JavaScript とサーバー側ハンドラーが必要) で使用するのではなく、.enabled = false通常のバリデーターを「親」コントロールのイベント ハンドラーの一部として設定するだけです。(コントロールのステータスは、最初のページの読み込み時とその後のポストバック ページの読み込み時にサーバー側でも設定されます。)

function showName(show){
  document.getElementById("txtName").style.display = (show ? "" : "none");
  document.getElementById("valName").enabled = show;
}

問題は、バリデータが無効になり、フォームがポストバックされ、(ユーザーの操作によって) コントロールが変更され、バリデータが有効になる一連のイベントにあります。バリデーターが (ポストバックの試みで) 失敗した場合、<imgコードはなくなっているため、代わりにErrorMessage画像があるべき場所にテキストを表示します。

InnerHTMLバリデータが有効である限り、 は残ります。

ページの読み込みごとに各バリデーターに画像を動的に追加する (これは本当にやりたくない) か、すべてをCustomValidators に変換する (これも本当にやりたくない) 以外に、誰も方法を知っていますか?このあたり?これは既知のバグですか (明らかなバグが見つからないため)?

私は Visual Studio 2010 で ASP.NET 2.0 を使用しています。残念ながら、現時点では ASP.NET の上位バージョンにアップグレードする立場にありません。

更新
私が発見したのは、<imgタグの前に実際に&nbsp;エンティティがあることです...そしてそれを削除すると、<imgバリデータ内にタグだけを残して動作します。

たくさん遊んだ後InnerHTML、バリデーターにプレーンテキストのみが含まれている場合 (つまり、ASP サーバー側のコントロールがない場合) InnerHTML、バリデーターが有効になっているかどうかに関係なく、ポストバック全体で保持されます。

ただし、プレーン テキスト (空白以外) でInnerHTML 始まり、サーバー側のコントロールもある場合、バリデーターが無効になっていると、ポストバック間で正しく保持されません。

なぜこれが当てはまるのかわかりませんが、小さなフォーマットの問題については確かに対処できます...それか&nbsp;、リテラルまたはタグ内に配置する必要style<imgあります...さまざまなオプションがたくさんありますその上で。

ASP.NET 4.0 テスト ベッド アプリケーションを使用して、そのバージョンで同じことが起こることを確認できます。

今後数日で追加したいものが他にない場合は、上記の質問に自分で「答え」ます。

4

1 に答える 1

0

As I stated in my updated question, the reason for the issue was due to the InnerHTML of the validator starting with &nbsp; and then containing a server-side control.

Before I had it as...

<asp:RequiredFieldValidator runat="server" ID="valName" ControlToValidate="txtName"
  ErrorMessage="Enter a name">&nbsp;<img runat="server" src="~/images/error.gif" 
  /></asp:RequiredFieldValidator>

To fix it, I simply removed the &nbsp;...

<asp:RequiredFieldValidator runat="server" ID="valName" ControlToValidate="txtName"
  ErrorMessage="Enter a name"><img runat="server" src="~/images/error.gif" 
  /></asp:RequiredFieldValidator>

Hopefully that will help somebody else, in the unlikely event that they find themselves in a situation situation.

As always, if somebody comes up with a different answer / solution, I'm always willing to reconsider my options.

于 2012-07-13T10:27:43.420 に答える