C# 如何在ASP.NET C中删除现有菜单项后将其添加回#

C# 如何在ASP.NET C中删除现有菜单项后将其添加回#,c#,asp.net,menu,navigation,menuitem,C#,Asp.net,Menu,Navigation,Menuitem,我正在尝试添加一个菜单项,一旦它被删除。我已使用以下代码删除该项目: NaviMenu.Items.Remove(NaviMenu.Items[1]); ASP.NET项目是在framework 4.5上创建的,该项目也是在Visual Studio 2012中创建的 该控件是一个ASP.NET菜单控件System.Web.UI.WebControls.menu不要与System.Windows.Forms.ContextMenuStripWeb菜单和Windows窗体菜单不相同,并且具有不同

我正在尝试添加一个菜单项,一旦它被删除。我已使用以下代码删除该项目:

NaviMenu.Items.Remove(NaviMenu.Items[1]);
ASP.NET项目是在framework 4.5上创建的,该项目也是在Visual Studio 2012中创建的

该控件是一个ASP.NET菜单控件
System.Web.UI.WebControls.menu
不要与
System.Windows.Forms.ContextMenuStrip
Web菜单和Windows窗体菜单不相同,并且具有不同的属性

我还想把物品恢复到原来的位置。默认情况下,菜单项已在菜单中。是否仍然可以恢复菜单项,而不必重新添加所有内容,如导航URL、Vaule等


其思想是在加载页面时删除菜单项。用户登录站点后,菜单中的某些项将为用户添加回来。

编辑:我走错了路,所以我要替换整个答案

好的,看起来System.Web.Ui.WebControl.MenuItem不包含隐藏/取消隐藏选项,尽管菜单包含。这真是愚蠢

没有简单的答案,有不同的方法来实现这一点。最重要的是你需要:

1) 按住要删除的菜单项对象。不能仅从菜单中引用对象

2) 跟踪每个项目在菜单中的位置

所以,我的新策略是。。。您应该有一个方法负责创建菜单。会是这样的

public class MyMenuItem
{
    public bool ShowWhenNotLoggedIn { get; set; }
    public System.Web.UI.WebControls.MenuItem MenuItem { get; set; }
}

List<MyMenuItem> MyMenuItems = new List<MyMenuItem>(); //Create all your menu items and put them in here before running the menthod below
void CreateMyMenu(bool IsUserLoggedIn)
{
    MyMenu.Items.Clear();
    foreach (MyMenuItem item in MyMenuItems)
    {
        if (item.ShowWhenNotLoggedIn || IsUserLoggedIn)
            MyMenu.Items.Add(item.MenuItem);
    }
}
公共类MyMenuItem
{
在{get;set;}
public System.Web.UI.WebControls.MenuItem MenuItem{get;set;}
}
List MyMenuItems=新列表()//在运行下面的方法之前,创建所有菜单项并将它们放在此处
void CreateMyMenu(bool IsUserLoggedIn)
{
MyMenu.Items.Clear();
foreach(MyMenuItems中的MyMenuItem项)
{
if(item.ShowWhenNotLoggedIn | | IsUserLoggedIn)
MyMenu.Items.Add(item.MenuItem);
}
}
所以,我喜欢的是,你不必总是记住物品的顺序。每次只需清除并重新创建整个菜单。与只在需要的地方删除/添加项目相比,它的效率稍低,但更易于阅读和理解代码。我认为让代码可读是值得的,但这是你的决定


还要注意,这有点像状态模式lite。我们定义了两种状态:登录和未登录。我们已经在受这些状态(菜单项)影响的对象上定义了这些状态。所以,一旦你写了这个逻辑,你就不必再纠缠于每个菜单项了。你只需声明你处于一个新的状态,每个人都会相应地更新自己。如果您有其他依赖于已登录与未登录的逻辑,那么您可以按照同样的方法对它们进行操作

您可以将菜单项的索引存储在某个位置,并使用Items.Insert(index,item)函数。如果不知道该项目是否存储在某些已删除项目列表中,很难给出答案。菜单项来自何处、列表、数据库、xml文件?@nwdev使用IDE在网站母版页的“菜单项编辑器”中创建的项。@nwdev我也看不到使用菜单后插入项的选项。很抱歉,这是AddAt方法。我更新了我的问题。我不知道怎样才能更清楚。关于“您可以继承MenuItem对象”和“创建ViewState的枚举”,您能否提供更多信息。一些例子会有所帮助。谢谢你的建议。哦,我又做了一个改变。您不能有虚拟数据字段,因此我将其更改为属性。我使用的不是ContextMenuStrip,而是菜单。System.Web.UI.WebControls.Menu ASP.NET中的菜单没有可见属性,因此代码对我无效。对此表示抱歉。我应该读得更仔细些。您在帖子描述中包含了asp.net,所以我应该假设我们是在使用web,而不是桌面。我会修改我的答案。它已经在标题中了,但我确实在阅读了你上一次发布的答案后将其添加到了描述中。别难过,有时候我会这么做再次感谢你给它一个机会