ASP.NETフォームアプリケーションでカスタムWebコントロールで奇妙な問題が発生しています。 WebアプリケーションのASP.NET Webコントロールは、最初のポストバック後に古いデータを表示します。
、私はそれは、このようなTextBox
やDropDownList
など、いくつかの他のコントロールとラベルを組み合わせたCompositeControl
から継承するクラスを作成するために、私に多くの時間を節約することを考え出しました。このコンポジットコントロールには、基になるプロパティのプロパティをラップするいくつかのプロパティがあります(例:EnteredTextはTextBox.Text
をラップします)。コントロールは通常のものと同じ方法でデータバインディングに使用できますが、txtBox.Text = someObject.someProperty
の代わりにcompositeControl.EnteredText = someObject.someProperty
を使用します。 これらのコントロールは、ASPXページとASCXユーザーコントロールで使用されます。
ウェブコントロールの最初のバージョンはC#で書かれており、完全に動作します。これらのコントロールは、ウェブサイトのApp_Code folder
に配置されています。しかし、このフォルダはむしろ大きくなっており、ポリシーのためにVB.NETですべてを書かなければならないので、VB.NETバージョンのコントロールをそこに置くことでクラスライブラリを作ることにしました。 Webアプリケーション全体をVB.NETに変換しますが、コントロールのみを変換します。
ただし、はではありません。 GridView
のリンクをクリックすると、ポップアップが開き、すべてのテキストボックスが正しく挿入されます。画面を閉じて同じグリッドから他のリンクをクリックすると、ボックスには正しく入力されず、最初のポストバックのデータがボックスに表示されます。デバッガを使用すると、すべてのボックスに適切なデータが入力されていることがわかります。レンダリングフェーズでは、基礎となるTextBox
のTextプロパティにすべての新しいデータが表示されます。それは画面上には表示されません。ポストバック後のデータを取得するときは、保存ボタンを押すときと同じように、通常どおりに動作します。
App_Code folder
のコントロールを同じページに配置すると、期待どおりに機能し、以前のポストバックのデータではなく新しいデータが表示されます。
ここに2つの貼り付けビンURLがあります。最初は作業用C#バージョンに、2番目はVB.NETバージョンに移動します。
C#バージョン:http://pastebin.com/SuWaHrMt
VB.NET版:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" Inherits="Controls_CustomControl" %>
<%@ Register Namespace="UI.CompositeControls" TagPrefix="cs" %>
<cs:TextBoxWithLabel ID="TextBoxWithLabel1" runat="server" LabelText="Voornaam" />
<cc:LabeledTextBox ID="tbwlVoornaam" runat="server" LabelText="Voornaam" />
CCプレフィックスがウェブに指定されています。http://pastebin.com/9aeV7St1
ここでは、それがASCXファイルで使われている方法の例です。設定:
<pages theme="Default" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
<controls>
<add assembly="CompositeControls" namespace="CompositeControls" tagPrefix="cc" />
</controls>
<namespaces>
<add namespace="CompositeControls" />
</namespaces>
</pages>
私は彼女を見逃していますeは、C#のバージョンとVBのバージョンが動作しないようにしますか?
ありがとうございます!明確化したい場合は、お気軽に質問してください。あなたは各ラウンドトリップでコントロールを再挿入した場合、
:
アップデート: 私は疑問に包括ASCX上のViewStateを無効にし、それが動作:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" EnableViewState="false" Inherits="Controls_CustomControl" %>
私の同僚は、次のコードを見つけました 動的に作成されたコントロールの各世代は、ビュー の状態からプロパティ値を取得します。多くの場合、 のコンテナコントロールのEnableViewStateプロパティをfalseに設定することで、この問題を回避できます。その場合、ダイナミックコントロールに関する情報は保存されず、 コントロールの連続するバージョンとの競合はありません。
これが突然コントロールにどのように当てはまるのか分かりません。これは、ポストバックイベントの後に発生するCreateChildControlsメソッドでControlsが追加されたためです。this MSDN article on ViewStateに基づいています。
誰かがここで正確に何が起こっているのか説明できますか?
この問題の解決策は、それがViewstateの問題であることを明確に示していると思います。フォームとユーザーコントロールの両方でASP.NETビューステートがどのように機能するかを理解する必要があります。 viewstateの既定の動作をオーバーライドする必要がある場合は、単に無効にしてください(EnableViewState = "false"を使用)。 –
@Julius A Watは私がこの問題をVB.NETバージョンではなくC#バージョンでどのように表示するかを示しています。私はデフォルトのViewStateの動作をオーバーライドしていませんでした。正直言って、これは解決策のようには感じません。なぜなら私は動作するバージョンを持っているからです。私が収集したものから、ViewStateはプログラムによって変更されたコントロールのプロパティを格納するために使用され、ポストバック全体で保持されます。 – user849924