2010-04-02 47 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(); 
    }