2010-04-02 49 views
0

我創建了一個應用程序,它具有一個菜單,其中的項目是動態創建的。該菜單充當語言菜單。ASP.NET頁面內容不會改變

<body runat="server"> 
    <form id="Form1" runat="server"> 
    <table class="TableLayout"> 
     <tr> 
      <td class="TopNav" align="right"> 
       <asp:Menu runat="server" ID="LanguageMenu" Orientation="Horizontal" OnMenuItemClick="LanguageMenu_MenuItemClick"> 
        <LevelMenuItemStyles> 
         <asp:MenuItemStyle CssClass="TopNavItem" /> 
        </LevelMenuItemStyles> 
        <StaticHoverStyle CssClass="TopNavItemHover" /> 
       </asp:Menu> 
      </td> 
     </tr> 
    ... 

我使用會話變量來設置我當前的語言。

但是如果我點擊菜單更改會話變量:

public void LanguageMenu_MenuItemClick(Object sender, MenuEventArgs e) 
     { 
      Session["language"] = e.Item.Text; 
     } 

頁面將重新加載與下面的代碼:

sportsPath = String.Format(@"{0}{1}\Sports\", xmlPath, Session["language"]); 
//create LeftNavigation 
      string[] sports = Directory.GetFiles(sportsPath); 
      LeftNavigation.Items.Clear(); 
      foreach (string sport in sports) 
      { 
       string text = sport.Replace(sportsPath, "").Replace(".xml", ""); 
       MenuItem item = new MenuItem(); 
       item.Text = text; 
       LeftNavigation.Items.Add(item); 
      } 

的東西是內容沒有改變,只我點擊其他東西后。

如果我在點擊menuItem之後跳過我的代碼,我可以看到它傳遞了代碼,它應該改變,但是由於某種原因,頁面需要另外一個額外的觸發器來修改它的內容。

我也看到頁面重新加載,所以我不明白爲什麼它不立即改變。我想我還沒有理解asp.net邏輯。

我在做什麼錯?

回答

1

Page_Load是之前觸發MenuItemClick事件,從而導致你的Session變量設置您的網頁更新後

要解決此問題,您可以將Page_Load中的代碼移動到Page_PreRender事件處理程序,該程序在MenuItemClick之後觸發。

+0

我將我的代碼移動到了一個方法,我啓動了頁面加載,並且還點擊了我的menuitem。基本上,解決方案是一樣的,將它從​​page_load移出。 感謝您清理那個 – WtFudgE 2010-04-02 12:25:19

0

解決方法是在更新Session中的語言首選項後,將用戶重定向到同一頁面。

public void LanguageMenu_MenuItemClick(Object sender, MenuEventArgs e) 
    { 
     Session["language"] = e.Item.Text; 
     Response.Redirct("samepage.aspx"); 
     Response.End(); 
    }