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页面。

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20


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(null, out 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进行属性查询的功能,也只有是管理员组的用户才能用这个功能。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

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的属性设为TaskResults1,PredefinedQuery属性设置如下: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.这样可以用不同的用户登录看看效果了。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

12.接下来实现当用户属于管理员组的时候可以使用GetMapInfo按钮和QueryAttributesTask1,当用户不属于管理员组时不能使用GetMapInfo按钮和QueryAttributesTask1。具体代码如下:

