2010-03-29 3 views
0

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

У меня возникли проблемы с программным программированием атрибута класса 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 { } 
} 
+0

Используете ли вы какие-либо AJAX или обновления панели в вашей страницы, что имеющие Проблемы с просмотром? –

+0

@Tj Kellie: Нет. Я прокомментировал все это, чтобы оставить меня с голыми костями. –

ответ

4

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

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

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

+0

@yoannr: Я обновил вопрос с помощью дополнительного кода. –

+0

Не нашли решение, извините! если вы найдете что-нибудь, сообщите нам об этом.;) – Arthis

Смежные вопросы