カスタムサーバーコントロールで状態を維持する適切な方法は何ですか?
-
03-07-2019 - |
質問
これは機能しますが、適切な方法ですか?
[入力]ボックスがあるカスタムサーバーコントロールがあります。 ASP.NET TextBoxを少し模倣したいのですが、完全ではありません。テキストボックスがレンダリングされるとき、ユーザーが値を選択できるようにするjavascriptがあり、その値を入力ボックスに配置します。
コントロールにパブリックテキストプロパティがあります。取得/設定では、コントロールのビューステートを取得/設定します-その部分は簡単ですが、コントロールがjavascriptを介して読み込まれると、Text getは実際には呼び出されません、JavaScriptを使用してこの公開プロパティを設定する適切な方法は何ですか(または、ユーザーがボックスに入力するだけの場合でも)?
編集: OnInit iで、フォームの値に到達することで状態が維持されるようにします。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
{
ViewState["MyInputBoxValue"]
= HttpContext.Current.Request.Form["MyInputBoxValue"];
}
}
HtmlTextWriteで実際に値を元に戻すには、次のようにします。
protected override void RenderContents(HtmlTextWriter output)
{
// There is an input control here and i set its value property
// like this using the Text internal defined.
output.Write("<input value=" + Text + ">.....
}
ありがとう
解決
IStateManagerの使用が最も効果的だと思います。
例:
partial class MyControl : System.Web.UI.UserControl, IStateManager
{
[Serializable()]
protected struct MyControlState
{
public bool someValue;
public string name;
}
protected MyControlState state;
public bool someValue {
get { return state.someValue; }
set { state.someValue = value; }
}
public bool IsTrackingViewState {
get { return true; }
}
protected override void LoadViewState(object state)
{
if ((state != null) && state is MyControlState) {
this.state = state;
}
}
protected override object SaveViewState()
{
return state;
}
protected override void TrackViewState()
{
base.TrackViewState();
}
}
getDefaultState()は、いくつかの正常なデフォルトを新しい状態構造体にロードするだけです。状態はページのビューステートで追跡され、ASPがページの入出力を処理します。
(上記のコードはVBから移植されており、チェックされていません。うまくいけばエラーは発生しませんでしたが、とにかくポイントを取得できるはずです)
他のヒント
ポストバック時に状態を維持する必要がある場合は、独自のメソッドを提供する必要があります ユーザーがクライアント側でコントロールを使用して行ったことを記録する サーバーのサーバーコントロールを後で更新する 変更、またはページの更新時にクライアント側で変更をやり直します。
うーん、既存のASP.NET永続性を使用できるかどうか疑問に思います...最も基本的なポストバック状態永続コントロールから継承してみてください(asp:hiddenと思っています)。次に、レンダリングをオーバーライドして、必要なジャズをすべて追加します。
動作するかどうかを教えてください。テストする必要はありません:)