我创建了一个应用程序,其中包含一个动态创建项目的菜单。菜单充当语言菜单。
<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逻辑。
我做错了什么?
答案 0 :(得分:1)
在Page_Load
事件之前触发 {strong>,因此会导致您的会话变量在页面更新后设置为。
要解决此问题,您可以将MenuItemClick
中的代码移至Page_Load
事件处理程序,该处理程序在Page_PreRender
之后触发。
答案 1 :(得分:0)
解决方法是在更新会话中的语言首选项后将用户重定向到同一页面。
public void LanguageMenu_MenuItemClick(Object sender, MenuEventArgs e)
{
Session["language"] = e.Item.Text;
Response.Redirct("samepage.aspx");
Response.End();
}