2010-06-07 2 views
1

Id aiment avoir mon application mvc 2 générant des rapports à la fois MS Word et PDF .... travaille actuellement sur Word. J'ai trouvé ceci:Vue ASP.NET MVC 2 (ViewModel) -> Génération MS Word ou PDF?

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

que je pense que les flux essentiellement la sortie de vue d'une action de contrôleur à un document Word ....

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


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

Et voici la classe qui étend 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(); 
} 

}

Qui semble pret ty bonne - mais mon problème est que mon avis rend d'un ViewModel, voici l'action

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

et voici mon modèle:

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; 
} 
} 

Je vais avoir des problèmes de connexion un peu les deux - à flux de la vue en utilisant mon viewmodel au pdf

+1

Est-ce que cela génère vraiment des documents Word? Il semble que ce soit juste le retour de HTML avec un type de contenu Word. – Rup

+0

@Rup, les utilisateurs obtiennent une bonne invite à ouvrir le mot, enregistre en mot très bien. J'utilise cette technique pour sortir de ne pas apprendre les Office apis. – jfar

Répondre

3

Il n'y a rien d'original dans ASP.NET MVC qui vous permet de construire un fichier PDF ou Word à partir d'une classe POCO. Vous devez le construire manuellement ou en utilisant une bibliothèque tierce. Une fois que vous avez fait cela, vous pouvez facilement écrire les octets au flux de réponse:

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

La méthode GeneratePdfForModel sera évidemment spécifique sur ce que la bibliothèque/API que vous utilisez pour générer le document.

0

L'astuce consiste à générer le fichier PDF à partir du fichier MS-Word. Vous avez probablement besoin d'un composant tiers pour cela.

Si vous n'avez pas besoin d'une fidélité de conversion parfaite, juste quelque chose qui est «assez bon», alors essayez Aspose.Words. Si vous avez besoin d'une conversion parfaite Fidelity, alors essayez a product I have worked on, il permet la conversion de tous les types typiques de MS-Office au format PDF en utilisant une interface de services Web.

0

Je suis un peu en retard à ce sujet, mais ce que je peux voir:

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

Votre URL est pointant vers la même action, il devrait pointer à votre action « startsearch » comme c'est celui qui produit le code HTML que vous voulez ouvrir par Word. Il doit être une URL complète aussi je pense.

J'essaie d'utiliser cette méthode aussi, je l'ai trouvé à partir de votre question! J'ai des problèmes en passant sur les informations d'identification autorisées dans WebRequest.Create (Url) pour la vue source cependant.