2010-06-07 67 views
1

我喜歡讓我的mvc 2應用程序生成MS Word和PDF格式的報告....目前正在使用Word。我發現這一點:ASP.NET MVC 2視圖(ViewModel) - > MS Word或PDF生成?

http://www.revium.com.au/articles/sandbox/aspnet-mvc-convert-view-to-word-document/

,我認爲基本上流從一個控制器動作到Word文檔輸出的觀點....

public ActionResult DetailedReport() 
    {    
     //[...]  
     return View(); 
    } 


public ActionResult DetailedReportWord() 
    { 
     string url = "DetailedReport"; 
     return new WordActionResult(url, "detailed-report.doc"); 
    } 

而且繼承人延伸的ActionResult

public class WordActionResult : ActionResult 
{ private string Url { get; set;}   
private string FileName { get; set;} 


public WordActionResult(string url, string fileName) 
{ 
    Url = url; 
    FileName = fileName; 
} 

public override void ExecuteResult(ControllerContext context) 
{ 
    var curContext = HttpContext.Current; 
    curContext.Response.Clear(); 
    curContext.Response.AddHeader("content-disposition", "attachment;filename=" + FileName); 
    curContext.Response.Charset = ""; 
    curContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    curContext.Response.ContentType = "application/ms-word"; 

    var wreq = (HttpWebRequest) WebRequest.Create(Url); 
    var wres = (HttpWebResponse) wreq.GetResponse(); 
    var s = wres.GetResponseStream(); 
    var sr = new StreamReader(s, Encoding.ASCII); 

    curContext.Response.Write(sr.ReadToEnd()); 
    curContext.Response.End(); 
} 

}

看起來像是pret TY不錯 - 但我的問題是,我的觀點從一個視圖模型渲染,這裏是行動

[HttpPost] 
    public ActionResult StartSearch(SearchResultsViewModel model) 
    { 
     SearchResultsViewModel resultsViewModel = _searchService.Search(model.Search, 1, PAGE_SIZE); 
     return View("Index", resultsViewModel); 
    } 

,這裏是我的模型:

public class SearchResultsViewModel 
{ 
[SearchWordLimit] 
public string Search { get; set; } 

public IEnumerable<Employee> Employees { get; private set; } 
public IEnumerable<Organization> Organizations { get; private set; } 
public PageInfo PageInfo { get; private set;} 

public SearchResultsViewModel() 
{ 
} 

public SearchResultsViewModel(string searchString, IEnumerable<Employee> employees, IEnumerable<Organization> organizations, PageInfo pageInfo) 
{ 
    Search = searchString; 
    Employees = employees; 
    Organizations = organizations; 
    PageInfo = pageInfo; 
} 
} 

我有麻煩還挺連接兩個 - 到使用我的viewmodel將視圖流化爲pdf

+1

這是否真的生成Word文檔?它看起來只是用Word內容類型返回HTML。 – Rup 2010-06-07 18:40:24

+0

@Rup,用戶得到一個很好的提示來打開它的話,保存在單詞中就好了。我使用這種技術擺脫不了解Office apis。 – jfar 2010-06-07 19:30:26

回答

3

ASP.NET MVC中沒有任何東西可以讓您從POCO類構建PDF或Word文件。您必須手動構建它或使用第三方庫。一旦你做到了這一點,你可以很容易地寫字節響應流:當然

public ActionResult SomeAction(SearchResultsViewModel model) 
{ 
    byte[] pdf = GeneratePdfForModel(model); 
    return File(pdf, "application/pdf"); 
} 

GeneratePdfForModel方法將特定您使用生成文檔庫什麼/ API。

0

訣竅是從MS-Word文件生成PDF文件。你很可能需要一個第三方組件。

如果你不需要完美的轉換保真度,只是'夠好'的東西,然後嘗試Aspose.Words。如果您需要完美轉換Fidelity,請嘗試a product I have worked on,它允許使用Web服務界面將所有典型MS-Office類型轉換爲PDF格式。

0

我有點晚了這一點,但是從我所看到的:

public ActionResult DetailedReportWord() 
{ 
    string url = "DetailedReport"; 
    return new WordActionResult(url, "detailed-report.doc"); 
} 

您的網址指向回到相同的動作,應該在你的「開始搜索」行動指向,因爲這是生成您想要由Word打開的HTML的那個。我認爲它也需要完整的URL。

我想使用這種方法,我發現它從你的問題!但是,我有問題通過源View的WebRequest.Create(Url)中的授權憑證傳遞。