实战HTTP Handler (6) -- 条码随意打

添加人:vs2005一级(339分)   添加时间:2007-09-05    阅读次数:2964  收藏此教程
为了使用RDLC报表,我们的数据源由第三篇中的数组改成了一个Domain Object:
VisitorTraffic.cs
 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Web;
 5using System.Web.Security;
 6using System.Web.UI;
 7using System.Web.UI.WebControls;
 8using System.Web.UI.WebControls.WebParts;
 9using System.Web.UI.HtmlControls;
10using System.Collections.Generic;
11/// <summary>
12/// VisitorTraffic 的摘要说明
13/// </summary>

14public class VisitorTraffic
15{
16    private string _website_name;
17    private string _visitor_traffic;
18    public static List<VisitorTraffic> find_all()
19    {
20        List<VisitorTraffic> result = new List<VisitorTraffic>();
21        result.Add(new VisitorTraffic("1. 使用分治法实现的全排列算法", "50"));
22        result.Add(new VisitorTraffic("2. 让Ruby的数组支持任意起始下标", "16"));
23        result.Add(new VisitorTraffic("3. 输出二叉树的方法", "14"));
24        return result;
25    }

26    public VisitorTraffic(string website_name, string visitor_traffic)
27    {
28        _website_name = website_name;
29        _visitor_traffic = visitor_traffic;
30    }

31    public string website_name
32    {
33        get { return _website_name; }
34        set { _website_name = value; }
35    }

36    public string visitor_traffic
37    {
38        get { return _visitor_traffic; }
39        set { _visitor_traffic = value; }
40    }

41}
 
VisitorTraffic 类的两个属性 website_name 和 visitor_traffic 分别表示网页名称和访问量。静态函数 find_all() 通过硬编码的方式返回3条有用的数据。VisitorTraffic 类放置在Web应用程序的 App_Code 文件夹下。
 
Default.aspx 中放置一个 GridView 控件和和一个 ReportViewer 控件。在Page_Load() 时初始化这两个控件。

Default.aspx
 1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
 3    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" 
%>
 4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5<html xmlns="http://www.w3.org/1999/xhtml">
 6<head runat="server">
 7    <title>无标题页</title>
 8</head>
 9<body>
10    <form id="form1" runat="server">
11        <div>
12            <asp:Label ID="Label2" runat="server" Font-Bold="True" ForeColor="#0000C0" Text="GridView:"></asp:Label>&nbsp;
13            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="3"
14                GridLines="Vertical" BackColor="White" BorderColor="#999999" BorderStyle="None"
15                BorderWidth="1px">
16                <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
17                <Columns>
18                    <asp:TemplateField HeaderText="网址">
19                        <ItemTemplate>
20                            <asp:Label ID="Label1" runat="server" Text='<%# Eval("website_name") %>'></asp:Label>
21                        </ItemTemplate>
22                    </asp:TemplateField>
23                    <asp:TemplateField HeaderText="访问量">
24                        <ItemTemplate>
25                            <asp:Image ID="Image1" runat="server" ImageUrl='<%# "~/MyHandler.jxd?data=" + Eval("visitor_traffic") %>' />
26                        </ItemTemplate>
27                    </asp:TemplateField>
28                </Columns>
29                <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
30                <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
31                <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
32                <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
33                <AlternatingRowStyle BackColor="#DCDCDC" />
34            </asp:GridView>
35            <br />
36            <asp:Label ID="Label3" runat="server" Font-Bold="True" ForeColor="#0000C0" Text="RDLC 报表:"></asp:Label>
37            <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="443px">
38            </rsweb:ReportViewer>
39        </div>
40    </form>
41</body>
42</html>
 
Default.aspx.cs
 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Web;
 5using System.Web.Security;
 6using System.Web.UI;
 7using System.Web.UI.WebControls;
 8using System.Web.UI.WebControls.WebParts;
 9using System.Web.UI.HtmlControls;
10using System.Collections.Generic;
11using Microsoft.Reporting.WebForms;
12public partial class _Default : System.Web.UI.Page
13{
14    protected void Page_Load(object sender, EventArgs e)
15    {
16        // 为 GridView 设置数据源
17        GridView1.DataSource = VisitorTraffic.find_all();
18        GridView1.DataBind();
19        // 初始化报表
20        ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Report.rdlc");
21        ReportViewer1.LocalReport.EnableExternalImages = true; // 允许使用外部图片
22        // 获取 MyHandler.jxd 的完整路径
23        string barcode_url = Request.Url.Scheme + "://" 
24            + Request.Url.Authority
25            + Request.ApplicationPath
26            + "/MyHandler.jxd?data="; //-> "http://localhost:6344/HttpHandlerDemo/MyHandler.jxd?data="
27        // 将 MyHandler.jxd 的完整路径通过报表参数传给报表
28        ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { new ReportParameter("barcode_url", barcode_url) });
29        // 为报表设置数据源
30        ReportViewer1.LocalReport.DataSources.Add(
31            new Microsoft.Reporting.WebForms.ReportDataSource("VisitorTraffic", VisitorTraffic.find_all()));
32    }

33}
 
GridView 的设置基本保持第三篇的样子没变,在此就不在赘述了。下面着重介绍一下在RDLC报表里呈现条码的方法。在RDLC报表里使用外部图片,需要
- 在代码中将报表对象的 EnableExternalImages 属性设为 true。
- 将“图像”控件放置在表控件中。
- 将“图像”控件的“Source”属性设为“External”。
- 将“图像”控件的“Value”属性设为图片的地址。

在进行到上面的第四步(将“图像”控件的“Value”属性设为图片的地址)时,麻烦出现了。天杀的比尔居然要求在“Source”属性为“External”的情况下,“Value”必须以 http://, https://, ftp://, file:, mailto:, 或 news: 之一开头。换句话说,不允许我将Value设成 "~/MyHandler.jxd?data="+ Fields!visitor_traffic.Value 这种相对路径。可是我在RDLC里如何能得到 MyHandler.jxd 的完整路径呀?!我曾经试过不用图像控件,直接在“访问量”字段中写 "<img src='~/MyHandler.jxd?data=" + Fields!visitor_traffic.Value + "' />"。期望能骗过RDLC,直接输出IMG标记,结果RDLC十分智能地把所有的“ <”字符全部替换成了&lt;   痛哭十分钟...
最后只好用了比较龌龊的方法:先在 Default.aspx.cs 中取得 MyHandler.jxd 的完整URL,然后通过报表参数(参数名为barcode_url)传递给RDLC报表对象(Default.aspx.cs 第26~33行)。而图像控件的Value属性就变成:Parameters!barcode_url.Value + Fields!visitor_traffic.Value
 
 
本系列到此就结束了。我们并没有介绍太多HTTP处理程序的理论知识,对HTTP Handler的利用也仅仅局限于将它作为一个“虚拟页面”,您看得一定十分不过瘾吧 ?HTTP 处理程序的另外一个重要的应用是实现URL重写,Scott Mitchell 的 《URL Rewriting in ASP.NET》对这个主题进行了深入的探讨,并给出了一个完整的解决方案。《ASP.NET 2.0高级编程》一书有对HTTP模块的详细描述,可以在线免费试读。希望本系列可以作为您通往精通HTTP处理技术之路的第一块垫脚石,再见。
 
2页 第2上一页12下一页
相关的教程: 条形码 HTTP Handler
收藏此教程

当前平均分: -2.3(3 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: