我正试图在删除菜单项后将其添加回来。我使用以下代码删除了该项目:
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等?
其思想是在加载页面时删除菜单项。用户登录到网站后,菜单中的一些项目将为用户添加回来。
Edit:我走错了路,所以我替换了整个答案。
好的,看起来System.Web.Ui.WebControls.MenuItem没有包含隐藏/取消隐藏的选项,尽管Menu包含。这真是愚蠢。
没有简单的答案,实现这一点有不同的方法。最重要的是你需要:
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);
}
}
所以,我喜欢的是,你不必总是记住项目的顺序。每次你只需清除并重新创建整个菜单。它的效率略低于只在需要的地方删除/添加项目,但更容易阅读和理解代码。我认为性能的提高值得让代码可读,但这是您的决定。
还要注意,这有点像State Pattern lite。我们定义了两种状态:已登录和未登录。我们在受这些状态影响的对象(菜单项)上定义了这些状态。所以,一旦你写了这个逻辑,你就不必再纠缠于每个菜单项了。你只是说宣布你处于一个新的状态,每个人都会相应地更新自己。如果您有其他依赖于登录和未登录的逻辑,您可以遵循同样的方法。