http://weblogs.asp.net/stephenwalther/archive/2008/06/16/asp-net-mvc-tip-2-create-a-custom-action-result-that-returns-microsoft-excel-documents.aspx 

摘要:在这个Tip中,Stephen Walther创建了一个自定义的ActionResult,可以由ASP.NET MVC控制器action返回。该ActionResult从一个LINQ to SQL查询生成了一个Excel文档。

译注:从本篇开始,为了方便,仅保留了C#代码。对VB.NET感兴趣的朋友可以参见原文。

在MVC应用程序中,控制器action可以返回一个ActionResult。特别是,他能够返回一些从ActionResult基类继承的东西——

  • - ViewResult
  • - EmptyResult
  • - RedirectResult
  • - RedirectToRouteResult
  • - JsonResult
  • - ContentResult

例如,你可以使用ViewResult向浏览器返回一个特定的视图,使用ContentResult向浏览器返回文本内容。

但是,如果你想向浏览器返回其他类型的内容——如图片、PDF文件或Excel文档呢?在这些情况下,你可以创建自己的ActionResult。在这个Tip中,我会想你展示如何创建一个能返回Excel文档的ActionResult。

清单1包含了ExcelResult的代码。 

清单1 - ExcelResult.cs

  1[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System;
  2[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.Mvc;
  3[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Data.Linq;
  4[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Collections;
  5[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.IO;
  6[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.UI.WebControls;
  7[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Linq;
  8[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web;
  9[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.UI;
 10[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Drawing;
 11[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult 
 12[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult 
 13[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultnamespace Tip2
 14}

所有的ActionResult都必须直接或间接继承自ActionResult基类。清单1中的ExcelResult就是这样,实际上,它直接继承了ActionResult类。ActionResult基类中有一个方法是必须实现的——Execute()方法。调用Execute()方法会生成ActionResult的结果产生的内容。

在清单1中,Execute()方法用于从Linq to SQL查询生成Excel文档。Execute()方法会调用WriteFile()方法将生成的Excel文档以正确的MIME类型写入到浏览器中。

通常,你不会从控制器action中直接返回一个ActionResult,而是利用Controller类提供的某个方法——

  • - View()
  • - Redirect()
  • - RedirectToAction()
  • - RedirectToRoute()
  • - Json()
  • - Content()

例如,如果你想从一个控制器action中返回一个视图,不要直接返回一个ViewResult,而是调用View()方法。View()方法会实例化一个ViewResult并将这个新的ViewResult返回给浏览器。

清单2中的代码包含三个应用于Controller类的扩展方法。这些扩展方法向Controller类添加了一个名为Excel()的方法。Excel()方法会返回一个ExcelResult。

清单2 - ExcelControllerExtensions.cs (C#) 

 1[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System;
 2[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.Mvc;
 3[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Data.Linq;
 4[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Collections;
 5[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.UI.WebControls;
 6[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Linq;
 7[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult 
 8[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultnamespace Tip2
 9}

清单3中的控制器展示了如何在控制器中使用Excel()扩展方法。该控制器包含三个方法,名字分别是GenerateExcel1()、GenerateExcel2()和GenerateExcel3()。所有这三个控制器action都返回Excel文档,这些Excel是从Movies数据表生成的。

清单3 - HomeController.cs (C#)

 1[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System;
 2[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Collections.Generic;
 3[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Linq;
 4[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Data.Linq;
 5[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Data.Linq.Mapping;
 6[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.UI.WebControls;
 7[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web;
 8[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing System.Web.Mvc;
 9[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing Tip2.Models;
10[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultusing Tip2;
11[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult 
12[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResultnamespace Tip2.Controllers
13}

最后,清单4中的Index.aspx视图展示了如何调用GenerateExcel()控制器action来生成Excel文档。注意其中的三个链接使用了GenerateExcel的三个版本。

清单4 - Index.aspx

 1[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult<%@ Page Language="VB" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="Tip2.Index" %>
 2[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult 
 4[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult<html xmlns="http://www.w3.org/1999/xhtml" >
 5[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult<head id="Head1" runat="server">
 6[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult    <title>Index Page</title>
 7[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult    <style type="text/css">
 8[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult    
 9[翻译] ASP.NET MVC Tip #2 - 创建可以返回Excel文档的自定义ActionResult    li
10>

打开Index视图,可以看到如图1所示的页面

当单击其中一个Generate Excel链接后,你可以得到不同的Excel文档。例如,单击第一个链接之后,你会得到如图2所示的Excel文档。

http://blogs.msdn.com/vsofficedeveloper/pages/Excel-2007-Extension-Warning.aspx)。

仿照该Tip介绍的方法,你可以创建各种类型的ActionResult。例如,你可以创建Image ActionResult、Word ActionResult或者PDF ActionResult。

http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip2/Tip2.zip。

-----

广告:欢迎光临[.NET正则表达式库] http://regex-lib.net/

相关文章: