在服务器上处理MenuItemClick时阻止页面刷新

时间:2012-03-15 22:49:29

标签: asp.net redirect menuitem

我有一个菜单项,点击后调用C#代码隐藏功能。
函数不会被调用,整个页面都会被刷新。

在aspx中:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal" onmenuitemclick="NavigationMenu_MenuItemClick">  
  <Items>  
    <asp:MenuItem Text="Item caption" Value="#" />  
  </Items>
</asp:Menu>

在C#中:

protected void NavigationMenu_MenuItemClick(object sender, MenuEventArgs e)  
{  
  Response.Redirect("");  
  SomeFunction();  
}

如果我正在删除重定向调用,页面会刷新并且看起来像一团糟。 欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

为了获得更好的答案,您可能希望编辑您的问题以更好地解释您要完成的任务。

没有NavigateUrl属性的菜单控件会发出HTML,其中包含一个(菜单项)列表,其中包含通过某些Javascript执行回发的超链接。

<ul class="level1">
    <li>
        <a class="level1selected" href="#" 
          onclick="__doPostBack(&#39;ctl00$MainContent$NavigationMenu&#39;,&#39;#&#39;)">
           Item caption</a>
   </li>
</ul>

处理菜单点击事件时,如果您的目的是将用户重定向到其他页面,我建议您只在菜单项上设置NavigateUrl属性,而不是使用Response.Redirect()

<asp:MenuItem Text="Item caption" Value="#" NavigateUrl="~/TargetPage.aspx" /> 

如果设置NavigateUrl属性,您会注意到onclick事件甚至没有添加到组成菜单项HTML的锚标记中。

<ul class="level1">
    <li>
        <a class="level1" href="TargetPage.aspx">Item caption</a>
    </li>
</ul>

如果您不打算使用菜单进行导航,而是在单击菜单项时执行某些逻辑并更新页面,您可以考虑将菜单放在UpdatePanel中并设置菜单触发异步回发。

ASPX:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
    <asp:UpdatePanel runat="server">
          <Triggers>
              <asp:AsyncPostBackTrigger ControlID="NavigationMenu" />
          </Triggers>
          <ContentTemplate>
              <asp:Label ID="label1" runat="server"></asp:Label>
              <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="true" IncludeStyleBlock="false" Orientation="Horizontal" onmenuitemclick="NavigationMenu_MenuItemClick">  
                  <Items>  
                      <asp:MenuItem Text="Item caption" Value="#" />  
                  </Items>
              </asp:Menu>
        </ContentTemplate>
    </asp:UpdatePanel>

代码背后:

protected void NavigationMenu_MenuItemClick(object sender, MenuEventArgs e)
{
    SomeFunction();
}

private void SomeFunction()
{
    //Performed some logic
    label1.Text = "Altered the page on menu item click";
}