6

この質問が以前に何度も出されたことは承知していますが、私には独特のシナリオがあると思います。

子コントロール (ASCX) を読み込んで、そのコントロールにプロパティを設定しています。これは、プロパティがnullになるポストバックまで完全に機能します。

ここでは、 ChildControl をロードする First Class :

protected override void CreateChildControls()
{
    MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath);
    control.MyProperty = base.MyProperty
    Controls.Add(control);
}

次に、子コントロールで次のコードを取得しました。

public partial class MyUserControl : UserControl
{
    public MyType MyProperty { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        //Exception on next line because Property is null (only on postback)
        var somevalue = MyProperty.SubProperty;
4

3 に答える 3

12

Ok。説明してみましょう。
1. ページが作成されると、完全なページライフサイクル
が得られます 2. コントロールをクリックしてユーザー コントロールを作成すると、それが得られます
3. このコントロールに値を入力し、ポストバックを取得し
ます 4. サーバー側でポストバックが処理されますですが、ご覧のとおり、ページが読み込まれるとすぐにビューステート アクションが表示されます。
ビューステートの主な目的の 1 つは、コントロール イベントを処理して、イベントが変更されたかどうかを確認したり、状態などを保存したりすることです。
5. ビューステートがロードされた時点でコントロールがまだ構築されていない場合、そのイベントと値はすべて無視されます。

解決策は、それを静的コントロールにして非表示にするか、viewstate アクションが開始される前に作成するかのいずれかです。

于 2012-06-07T09:25:43.030 に答える
6

コントロールを追加し、Page_Init イベントにプロパティを設定する必要があります。そうしないと、プロパティの値が失われます。

于 2012-06-07T09:57:09.420 に答える
2

Microsoft の ASP.NET ページライフ サイクルに関する説明では、動的に作成されるコントロールはPreInitで作成する必要があると書かれています。

それは私のために働いた。これが私のメインページです:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl FiltersZone;

(. . .)

 protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        FiltersZone.Controls.Add(new PlanningFiltersSurgeonWeb());
    }

この動的に作成された「.ascx」コントロールには、隠しフィールドが含まれています。

<input id="hidTxtPaint" type="hidden" name="hidTxtPaint" runat="server" />

JavaScript から開始された " " または" "Page_Loadの後、動的に作成された ASCX コントロール イベント内からその値を取得できるようになりました。submit__dopostback('hidTxtPaint')

一方、隠しフィールドの値は、親の「.ascx」コントロールがメイン ページのPage_Loadイベントに追加された場合、POST 後に常に空になります。

于 2016-02-16T09:18:03.050 に答える