Первый, некоторые контекст:Как определить, используется View при вызове View (модель объекта)
- Язык - C#
- платформы - .Net Framework 4.5
- Тип проекта - ASP .Net MVC 4
Я пытаюсь определить, какой вид в проекте MVC обрабатывает явный вызов следующего метода. Документы MSDN для метода здесь: http://msdn.microsoft.com/EN-US/library/dd492930.aspx
protected internal ViewResult View(
Object model
)
Оригинала Автор использует View для создания PDF-файла с библиотекой третьей стороны. Мне нужно изменить представление, чтобы включить дополнительную информацию.
Проблема: У меня возникли проблемы с поиском вида, который можно изменить. Их сотни, и (ИМХО) их плохо называют и организовывают. Основной процесс создания PDF-файла выглядит следующим образом. Я путаюсь между шагами 3 и 4.
-
ID
- хозяйствующего субъекта передаются на ActionResult
- Лица, извлеченная из резервного хранилища
- модели передается метода Controller.View упомянутый выше:
var viewModel = View (model);
var xmlText = RenderActionResultToString (viewModel); - Получившийся ViewResult используется с экземпляром ControllerContext для генерации HTML, как если бы он запрашивался браузером.
- Полученный HTML-код передается стороннему инструменту и преобразуется в PDF-файл.
Я понимаю все остальное очень четко. Я не понимаю, как вызов View (model) определяет, какой файл View следует использовать при возврате ViewResult. Любая помощь очень ценится!
Включая код, указанный ниже, на случай, если кто-нибудь определит ответ.
ActionResult:
public ActionResult ProposalPDF(String id, String location, bool hidePrices = false)
{
var proposal = _adc.Proposal.GetByKey(int.Parse(id));
var opportunity = _adc.Opportunity.GetByKey(proposal.FkOpportunityId.Value);
ViewData["AccountId"] = opportunity.FkAccountId;
ViewData["AccountType"] = opportunity.FkAccount.FkAccountTypeId;
ViewData["Location"] = location;
ViewData["HidePrices"] = hidePrices;
return ViewPdf(proposal);
}
Метод ViewPDF:
protected ActionResult ViewPdf(object model)
{
// Create the iTextSharp document.
var document = new Document(PageSize.LETTER);
// Set the document to write to memory.
var memoryStream = new MemoryStream();
var pdfWriter = PdfWriter.GetInstance(document, memoryStream);
pdfWriter.CloseStream = false;
document.Open();
// Render the view xml to a string, then parse that string into an XML dom.
var viewModel = View(model);
var xmlText = RenderActionResultToString(viewModel);
var htmlPipelineContext = new HtmlPipelineContext();
htmlPipelineContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
//CSS stuff
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
var cssResolverPipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlPipelineContext, new PdfWriterPipeline(document, pdfWriter)));
var xmlWorker = new XMLWorker(cssResolverPipeline, true);
var xmlParser = new XMLParser(xmlWorker);
xmlParser.Parse(new StringReader(xmlText));
// Close and get the resulted binary data.
document.Close();
var buffer = new byte[memoryStream.Position];
memoryStream.Position = 0;
memoryStream.Read(buffer, 0, buffer.Length);
// Send the binary data to the browser.
return new BinaryContentResult(buffer, "application/pdf");
}
RenderActionResultToString вспомогательный метод:
protected string RenderActionResultToString(ActionResult result)
{
// Create memory writer.
var sb = new StringBuilder();
var memWriter = new StringWriter(sb);
// Create fake http context to render the view.
var fakeResponse = new HttpResponse(memWriter);
var fakeContext = new HttpContext(System.Web.HttpContext.Current.Request, fakeResponse);
var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), this.ControllerContext.RouteData, this.ControllerContext.Controller);
var oldContext = System.Web.HttpContext.Current;
System.Web.HttpContext.Current = fakeContext;
// Render the view.
result.ExecuteResult(fakeControllerContext);
// Restore data.
System.Web.HttpContext.Current = oldContext;
// Flush memory and return output.
memWriter.Flush();
return sb.ToString();
}
varAR будет ActionResult или, более конкретно, BinaryContentResult. Я не знаю свойства на любом типе, который я бы опросил, чтобы определить, какой файл View был использован. Я что-то упускаю? –