1

私の ASCX には、asp.net 隠しフィールドが として定義されてい<asp:HiddenField ID="hdnNewAsset" runat="server" />ます。

コード ビハインドには、次のコードがあります。

    protected void Page_Load(object sender, EventArgs e)
    {
        _service = new ArticleDataService(PortalId);

        if (!IsPostBack)
        {
            string rawId = Request[ArticleQueryParams.ArticleId];
            DisplayArticleDetails(rawId);
        }

        if (hdnNewAsset.Value.Trim() != string.Empty)
            ProcessNewAsset();
    }

今、私のフロントエンドには、イベントに反応して隠しフィールドを設定し、ポストバックをトリガーする JavaScript 関数があります。

function assetSelected(assetGuid) {
    $('input[id*="hdnNewAsset"]').val(assetGuid);
    __doPostBack()
}

何が起こっているかというと、隠しフィールドがマークアップに設定されていることです (chrome は を示し[ <input type=​"hidden" name=​"dnn$ctr466$Main$ctl00$hdnNewAsset" id=​"dnn_ctr466_Main_ctl00_hdnNewAsset" value=​"98d88e72-088c-40a4-9022-565a53dc33c4">​ ]ています$('input[id*="hdnNewAsset"]'))。

ただし、ポストバックが発生するhdnNewAsset.Valueと、空文字列になります。

さらに不可解なのは、 show の開始時Page_Load Request.Params["dnn$ctr466$Main$ctl00$hdnNewAsset"]98d88e72-088c-40a4-9022-565a53dc33c4、ポストバック後に隠しフィールドの値が同じであることです (したがって、隠しフィールドはポストバック間で永続化されます) hdnNewAsset.Value

誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

0

OK、私は問題を理解しました。

問題は、上記のコードが ASCX ユーザー コントロールの一部であったことです。Page_Loadそのユーザー コントロールは、親コントロールのイベント中に asp.net プレースホルダーに動的に読み込まれていました。

したがって、これらの呼び出しは両方ともPage_Loadそれぞれの呼び出しの中にあったため、内部コントロールの値が内部コントロールの にバインドされていなかったようpage_loadです。すべてのバインディングを修正するPage_Init代わりに、内部コントロールが読み込まれるように変更します。Page_Load

私が一般大衆にとって意味のある方法でそれを書いたかどうかはわかりません。


編集: MSDNドキュメントのこの部分が私の問題に関連しているようです:

コントロールが実行時に動的に作成されるか、データ バインド コントロールのテンプレート内で宣言的に作成される場合、それらのイベントは最初はページ上の他のコントロールのイベントと同期されません。たとえば、実行時に追加されるコントロールの場合、Init および Load イベントは、宣言的に作成されたコントロールの同じイベントよりも、ページのライフ サイクルのかなり後で発生する可能性があります。したがって、それらがインスタンス化された時点から、動的に追加されたコントロールとテンプレート内のコントロールは、Controls コレクションに追加されたイベントに追いつくまで、次々にイベントを発生させます。

于 2012-11-29T17:02:52.687 に答える