0

オブジェクトを内部プロパティとして使用するユーザー コントロールがあります (一部のコードを以下に示します)。

Step クラスの属性をプログラムで設定するのに問題があります。プログラムで設定すると、ビューステート (?) と関係があることを示すポストバックで失われます。

Step クラスのプロパティを宣言的に設定すると、正常に動作します。

このコードが何であるか/ポストバック全体で状態が失われる原因について何か考えている人はいますか?

ASPXページ

    <uc1:StepControl ID="StepControl1" runat="server">
        <Step1 Title="1. Select your Products" Enabled="true">
            <Content>

                <div class="clearfix">
                    <div class="floatRight">
                        <asp:Button ID="btnGoToStep2" 
                        runat="server" 
                        Text="Next" 
                        CausesValidation="false" 
                        OnClick="btnGoToStep2_OnClick" />
                    </div>
                </div>

            </Content>
        </Step1>
        <Step2 Title="2. Select your Features">      
            <Content>

                <div class="clearfix">
                    <div class="floatLeft">
                        <asp:Button ID="btnBackToStep1" 
                        runat="server" 
                        Text="Back" 
                        CausesValidation="false" 
                        OnClick="btnBackToStep1_OnClick" />
                    </div>                    
                    <div class="floatRight">
                        <asp:Button ID="btnGoToStep3" 
                        runat="server" 
                        Text="Next" 
                        CausesValidation="false" 
                        OnClick="btnGoToStep3_OnClick" />
                    </div>
                </div>                    

            </Content>
        </Step2>                     
    </uc1:StepControl>

ASPX コードビハインド

    protected void btnGoToStep2_OnClick(object sender, EventArgs e)
    {
        StepControl1.Step1.StatusText = "4 Products Selected";
    }

    protected void btnBackToStep1_OnClick(object sender, EventArgs e)
    {
        // StatusText (of Step1) gets lost at this point. 
    }

ユーザー制御コードビハインド

public partial class StepControl : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [NotifyParentProperty(true)]
    public Step Step1 { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [NotifyParentProperty(true)]
    public Step Step2 { get; set; }

    protected void Page_Init(object sender, EventArgs e)
    {
        AddSteps();
    }

    private void AddSteps() { }
}

[Serializable()]
[ParseChildren(true)]
[PersistChildren(false)]
public class Step
{
    [PersistenceMode(PersistenceMode.Attribute)]
    public string Title { get; set; }

    [PersistenceMode(PersistenceMode.Attribute)]
    public string Status { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    [TemplateContainer(typeof(StepContentContainer))]
    public ITemplate Content { get; set; }

    public class StepContentContainer : Control, INamingContainer { }
}
4

2 に答える 2

4

設定した文字列がViewStateに到達することはないと思います。ここでは用語が少し不足しています(用語はわかりません)が、属性[PersistenceMode(PersistenceMode.Attribute)]はASP.NETに、マークアップ(ASPXファイル)で「ステータス」という属性を検索するように指示しているだけだと思います。 1つは、プロパティStatusをその値に設定します(実際、例のどこに正確に配置されているのでしょうか?)。ただし、ViewStateに何かを入れるように指示することはありません。

Statusこれらの線に沿ってプロパティを定義する場合

[PersistenceMode(PersistenceMode.Attribute)]
public string Status
    {
        get
        {
            object o = ViewState["Status"];
            if(o != null) {
                return (string)o;
            }
            return string.Empty;
        }
        set
        {
            ViewState["Status"] = value;
        }
    }

あなたはより良いはずです。

残りの部分については、UserControlsを呼び出す必要があるのか​​、それともTrackViewState()オーバーライドする必要があるのか​​わかりませんが、そうは思いません。この場合、次のリンクが役立つ可能性があります。SaveViewStateLoadViewState

于 2010-04-05T15:08:36.573 に答える
0

ページ内のコントロールの作成順序と関係がある可能性があります。ポストバック後に、コントロールがページの最初のロードと同じ順序で作成されていない場合、ビューステートの取得はそれらのコントロールに対して機能しません。

ステップの属性をプログラムでどのように設定しますか?

于 2010-03-29T14:59:36.643 に答える