Usercontrol теряет Viewstate через Postback - PullRequest
0 голосов
/ 29 марта 2010

У меня есть пользовательский элемент управления, который использует объекты в качестве внутренних свойств (часть кода приведена ниже).

У меня возникают проблемы с программной установкой атрибута класса Step, когда он устанавливается программно, он теряется при обратной передаче, что указывает на какое-то отношение к Viewstate (?).

При декларативной установке свойства класса 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 { }
}

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Я думаю, что заданная вами строка никогда не попадает в ViewState. Мне немного не хватает терминологии (читай: я не знаю терминологию), но я думаю, что ваш атрибут [PersistenceMode(PersistenceMode.Attribute)] говорит только ASP.NET, что он должен искать атрибут с именем «Status» в разметке (ASPX-файл) если он найдет его, присвойте свойству 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;
        }
    }

тебе должно быть лучше.

В остальном я не уверен, нужно ли вам вызывать TrackViewState() в UserControls или даже переопределять SaveViewState и LoadViewState, но я так не думаю. В этом случае могут помочь следующие ссылки:

0 голосов
/ 29 марта 2010

Возможно, это связано с порядком создания элементов управления на странице. Если после обратной передачи элементы управления не создаются в том же порядке, что и при первой загрузке страницы, то получение состояния просмотра не будет работать для этих элементов управления.

Как установить атрибут шага программно?

...