ExtAspNet.ActiveWindow.GetConfirmFormModifiedClosePostBackReference();intmenuId=GetQueryIntValue("id");XMenumenu=XMenu.FetchByID(menuId);if(menu==null){//参数错误,首先弹出Alert对话框然后关闭弹出窗口ExtAspNet.Alert.Show("参数错误!",String.Empty,ExtAspNet.ActiveWindow.GetCloseReference());return;}tbxName.Text=menu.Name;tbxUrl.Text=menu.NavigateUrl;tbxSortIndex.Text=menu.SortIndex.ToString();cbxShow.Checked=menu.Show;//绑定下拉列表BindDDL(menu);}
在介绍这段代码之前,我们先回忆下父页面中的Grid的编辑链接是如何定义的:
也就是说,当打开此编辑菜单的页面时,URL应该类似如下形式:http://localhost/appbox/admin/menu_edit.aspx?id=6所以,我们首先通过定义在PageBase中的GetQueryIntValue方法,获取URL中id值:protectedstringGetQueryValue(stringqueryKey){returnRequest.QueryString[queryKey];}protectedintGetQueryIntValue(stringqueryKey){
intqueryIntValue=-1;try{queryIntValue=Convert.ToInt32(Request.QueryString[queryKey]);}catch(Exception){//TODO}returnqueryIntValue;}
之后再来看下这段代码:XMenumenu=XMenu.FetchByID(menuId);if(menu==null){//参数错误,首先弹出Alert对话框然后关闭弹出窗口ExtAspNet.Alert.Show("参数错误!",String.Empty,ExtAspNet.ActiveWindow.GetCloseReference());return;}我们可以把这段代码直译为,如果对应的menuId不存在,则首先弹出Alert对话框,在用户点击对话框的确认按钮后,关闭当前弹出的窗口(ActiveWindow)。对应的页面的效果为(是不是很酷):
绑定下拉列表代码
这段代码将是本章中最出彩的一段,我们要完成的功能如下(可以在后面看到对应的代码实现):1.从数据库查询所有的菜单,按照SortIndex由小到大排序,生成XMenuCollection(这是SubSonic生成的数据库表映射实体类)。2.通过XMenuHelper.GetMyMenuCollection静态函数将此对象转换为List(内部已经计算好TreeLevel和IsTreeLeaf)。3.添加根节点(所有节点的TreeLevel加一)。4.设置当前节点以及当前节点的所有子节点都不可选择(这是通过ExtAspNet支持的方法来做的)。5.绑定模拟树的下拉列表。6.选中下拉列表中当前节点的父节点来看下对应的代码实现:privatevoidBindDDL(XMenumenu){XMenuCollectionmenus=newSelect().From().OrderAsc(XMenu.SortIndexColumn.ColumnName).ExecuteAsCollection();ListnewMenus=XMenuHelper.GetMyMenuCollection(menus);//所有节点的TreeLevel加一,然后添加根节点foreach(MyMenumyMenuinnewMenus){myMenu.TreeLevel+=1;}MyMenurootMenu=newMyMenu();rootMenu.Name="==根节点==";rootMenu.Id=0;rootMenu.TreeLevel=0;newMenus.Insert(0,rootMenu);//本节点不可点击(也就是说当前节点不可能是当前节点的父节点)//并且本节点的所有子节点也不可点击,你想如果当前节点跑到子节点的子节点,那么这些子节点就从树上消失了boolstartChileNode=false;intcurrentMenuTreeLevel=0;foreach(MyMenumyMenuinnewMenus){if(myMenu.Id==menu.Id)
{currentMenuTreeLevel=myMenu.TreeLevel;myMenu.Enabled=false;startChileNode=true;}else{if(startChileNode){if(myMenu.TreeLevel>currentMenuTreeLevel){myMenu.Enabled=false;}else{startChileNode=false;}}}}//绑定到下拉列表(启用模拟树功能和不可选择项功能)ddlParentMenu.EnableSimulateTree=true;ddlParentMenu.DataTextField="Name";ddlParentMenu.DataValueField="Id";ddlParentMenu.DataSimulateTreeLevelField="TreeLevel";ddlParentMenu.DataEnableSelectField="Enabled";ddlParentMenu.DataSource=newMenus;ddlParentMenu.DataBind();//选中当前节点的父节点ddlParentMenu.SelectedValue=menu.ParentMenuId.ToString();}