ASP.NET MVC 2 View (ViewModel) -> Создание MS Word или PDF? - PullRequest
1 голос
/ 07 июня 2010

Мне бы хотелось, чтобы мое приложение mvc 2 генерировало отчеты в форматах MS Word и PDF ... в настоящее время оно работает на Word. Я нашел это:

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

Который, я думаю, в основном направляет вывод представления из действия контроллера в текстовый документ ....

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

}

Это выглядит довольно неплохо, но моя проблема в том, что мое представление отображается из ViewModel, вот действие

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

У меня возникли проблемы с их соединением - для потоковой передачи представления с помощью моей модели представления в pdf

Ответы [ 3 ]

3 голосов
/ 07 июня 2010

В ASP.NET MVC нет ничего нестандартного, что позволяет создавать файлы PDF или Word из класса POCO. Вы должны построить его вручную или с помощью сторонней библиотеки. Сделав это, вы можете легко записать байты в поток ответов:

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

Метод GeneratePdfForModel, конечно, будет зависеть от того, какую библиотеку / API вы используете для генерации документа.

0 голосов
/ 20 мая 2011

Я немного опоздал, но из того, что я вижу:

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

Ваш URL-адрес указывает на то же действие, он должен указывать на ваше действие "StartSearch", поскольку оно генерирует HTML-код, который вы хотите открыть в Word. Я думаю, это должен быть полный URL.

Я тоже пытаюсь использовать этот метод, я нашел его по вашему вопросу! У меня проблемы с передачей авторизованных учетных данных в WebRequest.Create (Url) для просмотра исходного кода, однако.

0 голосов
/ 07 июня 2010

Хитрость заключается в том, чтобы создать файл PDF из файла MS-Word.Скорее всего, для этого вам понадобится сторонний компонент.

Если вам не нужна идеальная точность преобразования, просто что-то «достаточно хорошее», попробуйте Aspose.Words.Если вам нужно идеальное преобразование Fidelity, попробуйте продукт, над которым я работал , он позволяет конвертировать все типичные типы MS-Office в формат PDF с помощью интерфейса веб-служб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...