实现一个自定义验证器控件
今天由于项目需要在页面上实现一个复合验证功能,本来想用脚本实现,发现会写一大堆重复的隐藏代码.最后选择了自己实现一个自定义验证器控件.这样以后也可以直接拿来复用. 因为往往需要同时满足1:用户输入不能为空.2: 输入值必须满足相应的格式. 这样的功能.而不用再为数据库添加字段来完成.

代码如下:
注意:开发环境为vs2008

代码如下:
1
using System;
2
using System.ComponentModel;
3
using System.Drawing;
4
using System.Security.Permissions;
5
using System.Web;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
9
namespace Kim.AspNet.Validatator.Controls
10
{
11
[
12
AspNetHostingPermission(SecurityAction.Demand,
13
Level = AspNetHostingPermissionLevel.Minimal),
14
AspNetHostingPermission(SecurityAction.InheritanceDemand,
15
Level = AspNetHostingPermissionLevel.Minimal),
16
DefaultEvent("ValidTextBoxChanged"),
17
DefaultProperty("Text"),
18
ToolboxData("<{0}:ValidTextBox runat=\"server\"> </{0}:ValidTextBox>"),
19
]
20
public class ValidTextBox : CompositeControl
21
{
22
//Contact Ways
23
private DropDownList validType;
24
//User Enter Values
25
private TextBox validTextBox;
26
27
//valid user enter values
28
//can not empty
29
private RequiredFieldValidator emailValidator;
30
private RequiredFieldValidator handphoneValidator;
31
private RequiredFieldValidator phoneValidator;
32
33
//have the right format
34
private RegularExpressionValidator emilFormatValidator;
35
private RegularExpressionValidator handphoneFormatValidator;
36
private RegularExpressionValidator phoneFormatValidator;
37
38
private static readonly object EventValidKey =
39
new object();
40
41
// get TextBox value
42
[
43
Bindable(true),
44
Category("Appearance"),
45
DefaultValue(""),
46
Description("get value from textbox")
47
]
48
public string TextValue
49
{
50
get
51
{
52
EnsureChildControls();
53
return validTextBox.Text;
54
}
55
set
56
{
57
EnsureChildControls();
58
validTextBox.Text = value;
59
60
}
61
}
62
63
64
[
65
Bindable(true),
66
Category("Appearance"),
67
DefaultValue(""),
68
Description("Error message for the phone validator.")
69
]
70
public string ValidPhoneErrorMessage
71
{
72
get
73
{
74
EnsureChildControls();
75
return phoneValidator.ErrorMessage;
76
}
77
set
78
{
79
EnsureChildControls();
80
phoneValidator.ErrorMessage = value;
81
phoneValidator.ToolTip = value;
82
}
83
}
84
85
86
[
87
Bindable(true),
88
Category("Appearance"),
89
DefaultValue(""),
90
Description("Error message for the hand phone validator.")
91
]
92
public string ValidHandPhoneErrorMessage
93
{
94
get
95
{
96
EnsureChildControls();
97
return handphoneValidator.ErrorMessage;
98
}
99
set
100
{
101
EnsureChildControls();
102
handphoneValidator.ErrorMessage = value;
103
handphoneValidator.ToolTip = value;
104
}
105
}
106
107
108
[
109
Bindable(true),
110
Category("Appearance"),
111
DefaultValue(""),
112
Description("Error message for the e-mail validator.")
113
]
114
public string ValidEmailErrorMessage
115
{
116
get
117
{
118
EnsureChildControls();
119
return emailValidator.ErrorMessage;
120
}
121
set
122
{
123
EnsureChildControls();
124
emailValidator.ErrorMessage = value;
125
emailValidator.ToolTip = value;
126
}
127
}
128
129
130
// The Valid event.
131
[
132
Category("Action"),
133
Description("Raised when the user input the value.")
134
]
135
public event EventHandler ValidTextBoxChanged
136
{
137
add
138
{
139
Events.AddHandler(EventValidKey, value);
140
}
141
remove
142
{
143
Events.RemoveHandler(EventValidKey, value);
144
}
145
}
146
147
148
protected virtual void OnValidTextBoxChanged(EventArgs e)
149
{
150
EventHandler TextBoxChangedHandler =
151
(EventHandler)Events[EventValidKey];
152
if (TextBoxChangedHandler != null)
153
{
154
TextBoxChangedHandler(this, e);
155
}
156
}
157
158
159
private void _TextBox_Changed(object source, EventArgs e)
160
{
161
OnValidTextBoxChanged(EventArgs.Empty);
162
}
163
164
protected override void RecreateChildControls()
165
{
166
EnsureChildControls();
167
}
168
169
170
protected override void CreateChildControls()
171
{
172
Controls.Clear();
173
174
ListItem list;
175
validType = new DropDownList();
176
validType.ID = "validDrpList";
177
178
list = new ListItem();
179
list.Text = "电话";
180
list.Value = "0";
181
validType.Items.Add(list);
182
183
list = new ListItem();
184
list.Text = "邮件";
185
list.Value = "1";
186
validType.Items.Add(list);
187
188
list = new ListItem();
189
list.Text = "手机";
190
list.Value = "2";
191
validType.Items.Add(list);
192
193
validTextBox = new TextBox();
194
validTextBox.ID = "validTextBox";
195
196
//phone valid
197
phoneValidator = new RequiredFieldValidator();
198
phoneValidator.ID = "phoneValidator";
199
phoneValidator.ControlToValidate = validTextBox.ID;
200
phoneValidator.Text = "电话号码不能为空!";
201
phoneValidator.Display = ValidatorDisplay.Dynamic;
202
203
phoneFormatValidator = new RegularExpressionValidator();
204
phoneFormatValidator.ID = "phoneFormatValidation";
205
phoneFormatValidator.Text = "电话号码格式不正确";
206
phoneFormatValidator.Display = ValidatorDisplay.Dynamic;
207
phoneFormatValidator.ControlToValidate = validTextBox.ID;
208
phoneFormatValidator.ValidationExpression = @"(0\d{2}-\d{8}|0\d{3}-\d{7})-\d{2,4}|(0\d{2}-\d{8}|0\d{3}-\d{7})";
209
210
//email valid
211
emailValidator = new RequiredFieldValidator();
212
emailValidator.ID = "emailValidator";
213
emailValidator.ControlToValidate =
214
validTextBox.ID;
215
emailValidator.Text = "请输入邮件地址!";
216
emailValidator.Display = ValidatorDisplay.Dynamic;
217
218
emilFormatValidator = new RegularExpressionValidator();
219
emilFormatValidator.ID = "emailFormatValidation";
220
emilFormatValidator.Text = "邮件格式不正确";
221
emilFormatValidator.Display = ValidatorDisplay.Dynamic;
222
emilFormatValidator.ControlToValidate = validTextBox.ID;
223
emilFormatValidator.ValidationExpression=@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
224
225
//handphone valid
226
handphoneValidator = new RequiredFieldValidator();
227
handphoneValidator.ID = "handphoneValidator";
228
handphoneValidator.ControlToValidate =
229
validTextBox.ID;
230
handphoneValidator.Text = "请输入手机号码!";
231
handphoneValidator.Display = ValidatorDisplay.Dynamic;
232
233
handphoneFormatValidator = new RegularExpressionValidator();
234
handphoneFormatValidator.ID = "handphoneValidation";
235
handphoneFormatValidator.Text = "手机号码格式不正确";
236
handphoneFormatValidator.Display = ValidatorDisplay.Dynamic;
237
handphoneFormatValidator.ControlToValidate = validTextBox.ID;
238
handphoneFormatValidator.ValidationExpression = @"^1[3,5][0-9][0-9]{8}$";
239
240
validTextBox.TextChanged += new EventHandler(_TextBox_Changed);
241
validType.AutoPostBack = true;
242
243
this.Controls.Add(validType);
244
this.Controls.Add(validTextBox);
245
246
this.Controls.Add(phoneValidator);
247
this.Controls.Add(phoneFormatValidator);
248
249
this.Controls.Add(emailValidator);
250
this.Controls.Add(emilFormatValidator);
251
252
this.Controls.Add(handphoneValidator);
253
this.Controls.Add(handphoneFormatValidator);
254
}
255
256
protected override void Render(HtmlTextWriter writer)
257
{
258
AddAttributesToRender(writer);
259
writer.AddAttribute(
260
HtmlTextWriterAttribute.Cellpadding,
261
"1", false);
262
writer.RenderBeginTag(HtmlTextWriterTag.Table);
263
264
//phone valid
265
if (validType.SelectedIndex == 0)
266
{
267
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
268
269
writer.RenderBeginTag(HtmlTextWriterTag.Td);
270
validType.RenderControl(writer);
271
writer.RenderEndTag();
272
273
writer.RenderBeginTag(HtmlTextWriterTag.Td);
274
validTextBox.RenderControl(writer);
275
writer.RenderEndTag();
276
277
writer.RenderBeginTag(HtmlTextWriterTag.Td);
278
phoneValidator.RenderControl(writer);
279
writer.RenderEndTag();
280
281
writer.RenderBeginTag(HtmlTextWriterTag.Td);
282
handphoneFormatValidator.RenderControl(writer);
283
writer.RenderEndTag();
284
285
writer.RenderEndTag();
286
}
287
//email valid
288
if (validType.SelectedIndex == 1)
289
{
290
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
291
writer.RenderBeginTag(HtmlTextWriterTag.Td);
292
validType.RenderControl(writer);
293
writer.RenderEndTag();
294
295
writer.RenderBeginTag(HtmlTextWriterTag.Td);
296
validTextBox.RenderControl(writer);
297
writer.RenderEndTag();
298
299
writer.RenderBeginTag(HtmlTextWriterTag.Td);
300
emailValidator.RenderControl(writer);
301
writer.RenderEndTag();
302
303
writer.RenderBeginTag(HtmlTextWriterTag.Td);
304
emilFormatValidator.RenderControl(writer);
305
writer.RenderEndTag();
306
307
writer.RenderEndTag();
308
}
309
//hand phone valid
310
if (validType.SelectedIndex == 2)
311
{
312
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
313
writer.RenderBeginTag(HtmlTextWriterTag.Td);
314
validType.RenderControl(writer);
315
writer.RenderEndTag();
316
317
writer.RenderBeginTag(HtmlTextWriterTag.Td);
318
validTextBox.RenderControl(writer);
319
writer.RenderEndTag();
320
321
writer.RenderBeginTag(HtmlTextWriterTag.Td);
322
handphoneValidator.RenderControl(writer);
323
writer.RenderEndTag();
324
325
writer.RenderBeginTag(HtmlTextWriterTag.Td);
326
phoneFormatValidator.RenderControl(writer);
327
writer.RenderEndTag();
328
writer.RenderEndTag();
329
}
330
writer.RenderEndTag();
331
}
332
}
333
}

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

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

注意:开发环境为vs2008