一、引言
如今,在ASP.NET开发中应用主题及皮肤等技术已广为人知,其优点自不必多言。本人也一直使用之,而且颇感效果良好,因为其以全局化的样式设计等支持技术简化了系统的界面设计而且使系统界面呈现一致性。然而,在最近的一次应用中却出乎意料地遭遇到了“主题相关内容”(因尚未详细探讨之故称呼此)的干扰。
二、问题描述
我在最近一个Web示例网站中想针对全局页面使用主题及皮肤控制,从而梦想实现上面提及的全局化界面的一致性。
1. 下面是我的配置文件Web.config中的相关一节:
<pagestheme="AjaxEShopping">
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
2. 我在一个示例网页temp.aspx中创建了如下的HTML标记代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="temp.aspx.cs" Inherits="temp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form. id="form1" runat="server">
<div>
<table style="width: 100%;">
<tr>
<td>验 证 码:</td>
<td>
<asp:TextBox ID="tbCode" runat="server" Width="80px"></asp:TextBox>
<img alt="" src='<%=Page.ResolveUrl("~/ValidateCode.aspx") %>' />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
3. 下面再来看文件 ValidateCode.aspx 内容:
<%@ Page Language="C#" AutoEventWireup="false" Inherits="ASPNETAJAXWeb.ValidateCode.Page.ValidateCode" %>
注: 仅仅有上面一行内容,而且也无需提供相应的ValidateCode.aspx.cs后台代码文件。
4. 下面是上面相应的图文验证类库相关实现代码:
[1]文件ValidateCode.cs相关代码:
using System;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;
namespace ASPNETAJAXWeb.ValidateCode.Page
{
public class ValidateCode:System.Web.UI.Page
{
private const double IMAGELENGTHBASE = 12.5;
private const int IMAGEHEIGTH = 22;
private const int IMAGELINENUMBER = 25;
private const int IMAGEPOINTNUMBER = 100;
public static string VALIDATECODEKEY = "VALIDATECODEKEY";
private int length = 4;
private string code = string.Empty;
/// <summary>
/// 获取或设置验证码长度,默认值为4。
/// </summary>
public int Length
{
get
{
return length;
}
set
{
length = value;
}
}
/// <summary>
/// 获取验证码
/// </summary>
public string Code
{
get
{
return Code;
}
}
public ValidateCode()
{
}
protected override void OnLoad(EventArgs e)
{
CreateValidateImage(length);
}
/// <summary>
/// 创建随机验证码
/// </summary>
/// <param name="length">验证码长度</param>
/// <returns></returns>
public string CreateCode(int length)
{
if(length <= 0) return string.Empty;
///创建一组随机数,并构成验证码
Random random = new Random();
StringBuilder sbCode = new StringBuilder();
for(int i = 0; i < length; i++)
{
sbCode.Append(random.Next(0,10));
}
///保存验证码到Session对象中
code = sbCode.ToString();
Session[VALIDATECODEKEY] = code;
return code;
}
/// <summary>
/// 创建验证码的图片和验证码
/// </summary>
/// <param name="length">验证码的长度</param>
public void CreateValidateImage(int length)
{ ///创建验证码
code = CreateCode(length);
///创建验证码的图片
CreateValidateImage(code);
}
/// <summary>
/// 创建验证码的图片和验证码
/// </summary>
/// <param name="code">验证码</param>
public void CreateValidateImage(string code)
{
if(string.IsNullOrEmpty(code) == true) return;
///保存验证码到Session对象中
Session[VALIDATECODEKEY] = code;
///创建一个图像
Bitmap image = new Bitmap((int)Math.Ceiling((code.Length * IMAGELENGTHBASE)),IMAGEHEIGTH);
Graphics g = Graphics.FromImage(image);
///随机数生成器
Random random = new Random();
try
{
///清空图像,并指定填充颜色
g.Clear(Color.White);
///绘制图片的干扰线
int x1,x2,y1,y2;
for(int i = 0; i < IMAGELINENUMBER; i++)
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
x2 = random.Next(image.Width);
y2 = random.Next(image.Height);
///绘制干扰线
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
}
///绘制验证码
Font font = new Font("Tahoma",12,FontStyle.Bold | FontStyle.Italic);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(code,font,brush,2.0f,2.0f);
///画图片的前景噪音点
int x,y;
for(int i = 0; i < IMAGEPOINTNUMBER; i++)
{
x = random.Next(image.Width);
y = random.Next(image.Height);
///绘制点
image.SetPixel(x,y,Color.FromArgb(random.Next()));
}
///画图片的边框线
g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width - 1,image.Height - 1);
///保存图片的内容到流中
MemoryStream ms = new MemoryStream();
image.Save(ms,ImageFormat.Gif);
///输出图片
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
finally
{ ///释放占有的资源
g.Dispose();
image.Dispose();
}
}
}
}
如今,在ASP.NET开发中应用主题及皮肤等技术已广为人知,其优点自不必多言。本人也一直使用之,而且颇感效果良好,因为其以全局化的样式设计等支持技术简化了系统的界面设计而且使系统界面呈现一致性。然而,在最近的一次应用中却出乎意料地遭遇到了“主题相关内容”(因尚未详细探讨之故称呼此)的干扰。
二、问题描述
我在最近一个Web示例网站中想针对全局页面使用主题及皮肤控制,从而梦想实现上面提及的全局化界面的一致性。
1. 下面是我的配置文件Web.config中的相关一节:
<pagestheme="AjaxEShopping">
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
2. 我在一个示例网页temp.aspx中创建了如下的HTML标记代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="temp.aspx.cs" Inherits="temp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form. id="form1" runat="server">
<div>
<table style="width: 100%;">
<tr>
<td>验 证 码:</td>
<td>
<asp:TextBox ID="tbCode" runat="server" Width="80px"></asp:TextBox>
<img alt="" src='<%=Page.ResolveUrl("~/ValidateCode.aspx") %>' />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
3. 下面再来看文件 ValidateCode.aspx 内容:
<%@ Page Language="C#" AutoEventWireup="false" Inherits="ASPNETAJAXWeb.ValidateCode.Page.ValidateCode" %>
注: 仅仅有上面一行内容,而且也无需提供相应的ValidateCode.aspx.cs后台代码文件。
4. 下面是上面相应的图文验证类库相关实现代码:
[1]文件ValidateCode.cs相关代码:
using System;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;
namespace ASPNETAJAXWeb.ValidateCode.Page
{
public class ValidateCode:System.Web.UI.Page
{
private const double IMAGELENGTHBASE = 12.5;
private const int IMAGEHEIGTH = 22;
private const int IMAGELINENUMBER = 25;
private const int IMAGEPOINTNUMBER = 100;
public static string VALIDATECODEKEY = "VALIDATECODEKEY";
private int length = 4;
private string code = string.Empty;
/// <summary>
/// 获取或设置验证码长度,默认值为4。
/// </summary>
public int Length
{
get
{
return length;
}
set
{
length = value;
}
}
/// <summary>
/// 获取验证码
/// </summary>
public string Code
{
get
{
return Code;
}
}
public ValidateCode()
{
}
protected override void OnLoad(EventArgs e)
{
CreateValidateImage(length);
}
/// <summary>
/// 创建随机验证码
/// </summary>
/// <param name="length">验证码长度</param>
/// <returns></returns>
public string CreateCode(int length)
{
if(length <= 0) return string.Empty;
///创建一组随机数,并构成验证码
Random random = new Random();
StringBuilder sbCode = new StringBuilder();
for(int i = 0; i < length; i++)
{
sbCode.Append(random.Next(0,10));
}
///保存验证码到Session对象中
code = sbCode.ToString();
Session[VALIDATECODEKEY] = code;
return code;
}
/// <summary>
/// 创建验证码的图片和验证码
/// </summary>
/// <param name="length">验证码的长度</param>
public void CreateValidateImage(int length)
{ ///创建验证码
code = CreateCode(length);
///创建验证码的图片
CreateValidateImage(code);
}
/// <summary>
/// 创建验证码的图片和验证码
/// </summary>
/// <param name="code">验证码</param>
public void CreateValidateImage(string code)
{
if(string.IsNullOrEmpty(code) == true) return;
///保存验证码到Session对象中
Session[VALIDATECODEKEY] = code;
///创建一个图像
Bitmap image = new Bitmap((int)Math.Ceiling((code.Length * IMAGELENGTHBASE)),IMAGEHEIGTH);
Graphics g = Graphics.FromImage(image);
///随机数生成器
Random random = new Random();
try
{
///清空图像,并指定填充颜色
g.Clear(Color.White);
///绘制图片的干扰线
int x1,x2,y1,y2;
for(int i = 0; i < IMAGELINENUMBER; i++)
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
x2 = random.Next(image.Width);
y2 = random.Next(image.Height);
///绘制干扰线
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
}
///绘制验证码
Font font = new Font("Tahoma",12,FontStyle.Bold | FontStyle.Italic);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(code,font,brush,2.0f,2.0f);
///画图片的前景噪音点
int x,y;
for(int i = 0; i < IMAGEPOINTNUMBER; i++)
{
x = random.Next(image.Width);
y = random.Next(image.Height);
///绘制点
image.SetPixel(x,y,Color.FromArgb(random.Next()));
}
///画图片的边框线
g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width - 1,image.Height - 1);
///保存图片的内容到流中
MemoryStream ms = new MemoryStream();
image.Save(ms,ImageFormat.Gif);
///输出图片
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
finally
{ ///释放占有的资源
g.Dispose();
image.Dispose();
}
}
}
}