我尝试在删除后添加一个菜单项。我使用以下代码删除了该项目:
NaviMenu.Items.Remove(NaviMenu.Items[1]);
ASP.NET项目是在框架4.5上创建的,项目也是在Visual Studio 2012中创建的。
该控件是一个ASP.NET菜单控件System.Web.UI.WebControls.Menu
,不要与System.Windows.Forms.ContextMenuStrip
混淆.Web菜单和Windows窗体菜单不相同,并且具有不同的属性。
我还希望将该项目恢复到原始位置。菜单项默认情况下已在菜单中。无论如何还原菜单项而不必重新添加所有内容,如导航URL,Vaule等?
这个想法是在加载页面时删除菜单项。用户登录网站后,菜单中的某些项目将被添加回用户。
答案 0 :(得分:1)
编辑:我走错了路,所以我正在取代整个答案。
好吧,看起来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。我们已经定义了两种状态:登录和未登录。我们已经在受这些状态影响的对象(菜单项)上定义了这些状态。所以,一旦你编写了这个逻辑,你就不必再详述每个菜单项了。你只是声明你处于一个新的状态,每个人都相应地更新自己。如果您有其他逻辑依赖于登录而未登录,您可以对它们执行相同的操作。