ArcGIS.Server.9.2.DotNet自带例子分析(八、一)

目的:
1.arcgis server9.2 ADF实现根据用户权限不同对地图功能进行控制

准备工作:
1.用ArcGis Server Manager或者ArcCatalog发布一个叫usa的Map Service,并且把这个Service启动起来。
2.找到DeveloperKit\SamplesNET\Server\Web_Applications目录下的Common_SecurityCSharp.zip。

开始:
1.Esri提供的范例是用MDF数据库和微软提供的Membership进行用户的创建登录管理等,这里为了方便没有用数据库了就写死2个权限不同的用户admin/admin,user/user。
2.新建名为Security的ASP.NET Web应用程序,然后新建Login.aspx页面用来进行用户的登录,一个用户名输入框;一个密码输入框;一个登录按钮就可以了非常的简单了不详细说明了,具体看一下登录代码:

 1 // 登录按钮的事件
 2 protected   void  Button1_Click( object  sender, EventArgs e)
 3          {
 4            if (TextBox1.Text == "admin" && TextBox2.Text == "admin")
 5            {
 6                Session["user"= "admin";
 7                Session["type"= "管理员";
 8                Response.Redirect("Default.aspx");
 9            }

10            else if (TextBox1.Text == "user" && TextBox2.Text == "user")
11            {
12                Session["user"= "user";
13                Session["type"= "普通用户";
14                Response.Redirect("Default.aspx");
15            }

16            else
17            {
18                Label1.Text = "登录失败!";
19            }

20        }
3.然后在Default.aspx页面中添加一个Label1用来显示用户登录信息,然后在cs代码中添加方法Page_PreRenderComplete,在这个方法中判定用户是否登录没有登录就跳到Login.aspx页面。
Code
4.在Default.aspx页面上添加MapResourceManager1、Map1、Toc1、Toolbar1,然后对这些控件做相应的设置了,这个比较简单了前面的文章都已经说了很详细了。
5.在Toolbar1中添加一个Command,用来获取地图和图层的信息,添加一个<div id="divMapInfo"></div> 用来显示获取的信息。当只有管理组的时候才可以使用这个功能。具体的定义如下:
1 < esri:Command  ClientAction =""  DefaultImage ="~/identify_1.gif"  JavaScriptFile =""  Name ="GetMapInfo"  ServerActionAssembly ="Security"  ServerActionClass ="Security.GetMapInformation"  Text ="Info"  ToolTip ="Get information about the map layers"   />
GetMapInformation的代码如下:
 1 namespace  Security
 2 {
 3    public class GetMapInformation : IMapServerCommandAction
 4    {
 5        public void ServerAction(ToolbarItemInfo info)
 6        {
 7            //获取地图控件
 8            Map mapCtrl = (Map)info.BuddyControls[0];
 9            //获取地图和图层信息
10            string mapInfo = GetMapAndLayerInformation(mapCtrl);
11            //把地图和图层信息显示在divMapInfo内
12            CallbackResult cbr = new CallbackResult("HtmlGenericControl""divMapInfo""innerContent", mapInfo);
13            mapCtrl.CallbackResults.Add(cbr);
14        }

15
16        private string GetMapAndLayerInformation(Map mapControl)
17        {
18            //初始化Functionalities
19            if (!mapControl.InitializedFunctionalities)
20            {
21                mapControl.InitializeFunctionalities();
22            }

23            System.Text.StringBuilder sbInfo = new System.Text.StringBuilder("<h2>Map Information:</h2>");
24            string[] fields, layerIDs, layerNames;
25            //获取MapFunctionality
26            foreach (IMapFunctionality mapFunct in mapControl.GetFunctionalities())
27            {
28                IGISResource gisResource = mapFunct.Resource;
29                //获取ResourceDefinition、Name用来显示
30                sbInfo.AppendFormat("<h3>Service: {0} ({1})</h3>", gisResource.ResourceDefinition, gisResource.Name);
31                if (gisResource.SupportsFunctionality(typeof(IQueryFunctionality)))
32                {
33                    //创建QueryFunctionality
34                    IQueryFunctionality queryFunct =(IQueryFunctionality)gisResource.CreateFunctionality(typeof(IQueryFunctionality), null);
35                    //查询图层的id和名称
36                    queryFunct.GetQueryableLayers(nullout layerIDs, out layerNames);
37                    for (int i = 0; i < layerIDs.Length; i++)
38                    {
39                        //获取地图名称用来显示
40                        sbInfo.AppendFormat("<h4>Layer {0}</h4>Fields:<br/>", layerNames[i]);
41                        //查询图层的字段用来显示
42                        fields = queryFunct.GetFields(null, layerIDs[i]);
43                        foreach (string fld in fields)
44                        {
45                            sbInfo.AppendFormat("{0}<br/>", fld);
46                        }

47                        sbInfo.Append("<br>");
48                    }

49                }

50                sbInfo.Append("<br>");
51            }

52            
53            return sbInfo.ToString();
54        }

55    }

56}

57
6.接下来用QueryAttributesTask在做一个通过选择states图层的STATE_NAME进行属性查询的功能,也只有是管理员组的用户才能用这个功能。
7.在页面上添加Menu1、TaskResults1、MapResourceManager1,把MapResourceManager1的BuddyControl设为Menu1,在MapResourceManager1添加一个QueryAttributesTask1,把QueryAttributesTask1的TaskResultsContainers-BuddyControl的属性设为TaskResults1,点击QueryAttributesTask1的PredefinedQuery属性栏弹出对话框进行设置,设置如下:Resource Manager:MapResourceManager1;Resource:MapResourceItem0;Layer:states;Label Text:Name;Associated Field:STATE_NAME;Operator:=;勾上Show Pick List并且点击Get Sample Values按钮添加选择项。
8.接下在做一个查询人口大于3000000的国家功能,添加QueryAttributesTask2,TaskResultsContainers-BuddyControl的属性设为TaskResults1PredefinedQuery属性设置如下:Resource Manager:MapResourceManager1;Resource:MapResourceItem0;Layer:counties;Label Text:Name;Associated Field:pop1999;Operator:>;Default value:3000000。
9.这样功能就开发完成了可以运行查看一下效果,接下来要根据登录用户的权限进行功能的控制。

10.当用户属于管理员组的时候可以在Map1和Toc1中显示ushigh图层,当用户不属于管理员组是不显示ushigh图层,在Page_PreRenderComplete方法中添加如下代码:
  1 // 要隐藏的图层名称
  2          private   string  layerToHide  =   " ushigh " ;
  3
  4          protected   void  Page_PreRenderComplete( object  sender, EventArgs e)
  5          {
  6            if (Session["user"== null)
  7            {
  8                Response.Redirect("Login.aspx");
  9            }

 10            else
 11            {
 12                Label1.Text = " 登录用户:" + Session["user"].ToString() + " 用户组:" + Session["type"].ToString();
 13            }

 14
 15            //如果用户不是管理员组的
 16            string ut = Session["type"].ToString();
 17            if ( ut!= "管理员")
 18            {
 19                //隐藏ushigh图层,在Map和Toc1中都不显示
 20                HideLayer(Map1, layerToHide);
 21            }

 22        }

 23
 24          // 隐藏图层
 25          private   void  HideLayer(Map map,  string  layerName)
 26          {
 27            foreach (IMapFunctionality mapFunct in map.GetFunctionalities())
 28            {
 29                //根据名称获取图层id
 30                string layerId = GetLayerId(layerName, mapFunct);
 31                if (!String.IsNullOrEmpty(layerId))
 32                {
 33                    //设置图层不可见
 34                    mapFunct.SetLayerVisibility(layerId, false);
 35                }
   
 36            }

 37
 38            //查找页面的上Toc控件,并且去掉图层名为ushigh的点
 39            Toc tocCtrl = FindControlOfType(typeof(Toc), Page.Controls) as Toc;
 40            if (tocCtrl != null && tocCtrl.BuddyControl == map.ID)
 41            {
 42                foreach (TreeViewPlusNode resource in tocCtrl.Nodes)
 43                {
 44                    TreeViewPlusNode nodeToRemove = null;
 45
 46                    foreach (TreeViewPlusNode layerNode in resource.Nodes)
 47                    {
 48                        TreeViewPlusNode matchNode = FindNodeRecursive(layerNode, layerName);
 49                        if (matchNode != null)
 50                        {
 51                            nodeToRemove = matchNode;
 52                            break;
 53                        }

 54                    }

 55                    if (nodeToRemove != null)
 56                    {
 57                        nodeToRemove.Remove();
 58                    }

 59                        
 60                }

 61            }

 62        }

 63
 64          // 查找TreeViewPlusNode
 65          private  TreeViewPlusNode FindNodeRecursive(TreeViewPlusNode node,  string  nodeName)
 66          {
 67            if (node.Text == nodeName)
 68            {
 69                return node;
 70            }

 71            foreach (TreeViewPlusNode node2 in node.Nodes)
 72            {
 73                TreeViewPlusNode childNode = FindNodeRecursive(node2, nodeName);
 74                if (childNode != null)
 75                {
 76                    return childNode;
 77                }

 78                    
 79            }

 80            return null;
 81        }

 82
 83
 84          // 根据图层名称获取图层的id
 85          private   string  GetLayerId( string  layerName, IMapFunctionality mapFunctionality)
 86          {
 87            string layerId = String.Empty;
 88            string[] layerIDs, layerNames;
 89            //查询图层名称
 90            mapFunctionality.GetLayers(out layerIDs, out layerNames);
 91            for (int i = 0; i < layerIDs.Length; i++)
 92            {
 93                if (layerNames[i] == layerName)
 94                {
 95                    layerId = layerIDs[i];
 96                    break;
 97                }

 98            }

 99            return layerId;
100        }

101
102          // 查询控件
103          public   static  Control FindControlOfType(Type type, ControlCollection controls)
104          {
105            foreach (Control ctl in controls)
106            {
107                if (type.IsInstanceOfType(ctl))
108                {
109                    return ctl;
110                }
 
111                else if (ctl.HasControls())
112                {
113                    Control childCtl = FindControlOfType(type, ctl.Controls);
114                    if (childCtl != null)
115                    {
116                        return childCtl;
117                    }

118                        
119                }

120            }

121            return null;
122        }

123
11.这样可以用不同的用户登录看看效果了。
12.接下来实现当用户属于管理员组的时候可以使用GetMapInfo按钮和QueryAttributesTask1,当用户不属于管理员组时不能使用GetMapInfo按钮和QueryAttributesTask1。具体代码如下:
Code
13.完成所有功能的编写,运行用不同用户登录测试效果。
ArcGIS.Server.9.2.DotNet自带例子分析(八、一)

你可能感兴趣的:(server)