asp.net-mvc - como - viewbag list
ASP.NET MVC 2 View(ViewModel)-> ¿Generación de MS Word o PDF? (3)
Me gustaría tener mi aplicación mvc 2 generando informes en formatos de MS Word y PDF ... actualmente trabajando en Word. Encontré esto:
http://www.revium.com.au/articles/sandbox/aspnet-mvc-convert-view-to-word-document/
Lo cual creo básicamente transmite la salida de vista de una acción de controlador a un documento de Word ....
public ActionResult DetailedReport()
{
//[...]
return View();
}
public ActionResult DetailedReportWord()
{
string url = "DetailedReport";
return new WordActionResult(url, "detailed-report.doc");
}
Y aquí está la clase que extiende 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();
}
}
Lo cual se ve bastante bien, pero mi problema es que mi vista se renderiza desde un ViewModel, aquí está la Acción
[HttpPost]
public ActionResult StartSearch(SearchResultsViewModel model)
{
SearchResultsViewModel resultsViewModel = _searchService.Search(model.Search, 1, PAGE_SIZE);
return View("Index", resultsViewModel);
}
y aquí está mi modelo:
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;
}
}
Tengo problemas para conectar los dos: para transmitir la vista con mi viewmodel a pdf
El truco es generar el archivo PDF desde el archivo MS-Word. Lo más probable es que necesite un componente de terceros para esto.
Si no necesita una fidelidad de conversión perfecta, solo algo que sea "lo suficientemente bueno", entonces intente Aspose.Words. Si necesita una conversión perfecta de Fidelity, pruebe un producto en el que he trabajado , permite la conversión de todos los tipos de MS-Office típicos a formato PDF mediante una interfaz de servicios web.
No hay nada fuera de lo común en ASP.NET MVC que le permita construir un archivo PDF o Word desde una clase POCO. Tienes que compilarlo manualmente o usando una biblioteca de terceros. Una vez que haya hecho esto, puede escribir fácilmente los bytes en la secuencia de respuesta:
public ActionResult SomeAction(SearchResultsViewModel model)
{
byte[] pdf = GeneratePdfForModel(model);
return File(pdf, "application/pdf");
}
El método GeneratePdfForModel
será, por supuesto, específico sobre qué biblioteca / API está utilizando para generar el documento.
Llego un poco tarde a esto, pero por lo que puedo ver:
public ActionResult DetailedReportWord()
{
string url = "DetailedReport";
return new WordActionResult(url, "detailed-report.doc");
}
Tu URL está apuntando hacia la misma Acción, debería estar apuntando a tu acción de "Búsqueda de inicio" ya que es la que produce el código HTML que deseas que Word abra. También necesita ser una URL completa, creo.
¡Estoy tratando de usar este método también, lo encontré por tu pregunta! Sin embargo, tengo problemas al pasar las credenciales autorizadas en WebRequest.Create (Url) para la vista de origen.