Возврат нескольких видов из одного действия в MVC3 & Razor - PullRequest
2 голосов
/ 10 декабря 2011

Сценарий: есть три вида (Razor) с именами «InvoiceBill», «Index», «Create».

  1. Представление «Создать» содержит страницу формы для ввода данных счета.
  2. Страница «Индекс» содержит список всех счетов-фактур на текущую дату.
  3. Счет-фактура содержиткод, который генерирует документ Excel (в виде отчета по счету) на основе этой ссылки (http://forums.asp.net/t/1711971.aspx/1).

. После того, как я отправлю форму (Создать представление), он может опубликовать данные формы в БД (используя EF)После вставки данных возвращается страница индекса.

Но теперь мне нужно вызвать представление «InvoiceBill» перед вызовом страницы индекса.

[HttpPost]
public ActionResult Create(FormCollection collection, InvoiceViewModel INVViewModel)
{
   if ((collection != null) && (this.ModelState.IsValid))
   {
        salesOrder.AccountNumber = INVViewModel.AccountNumber;
        salesOrder.BillToAddressID = INVViewModel.BillToAddressID;
        salesOrder.Comment = INVViewModel.Comment;
        salesOrder.ContactID = INVViewModel.ContactID;
        .
        .
        .
        .
        int sID = Using<CreateSalesOrder>().Execute(0, salesOrder);
***** From here i need to call the InvoiceBill page. Or guide me any other good way to achieve this
        return RedirectToAction("Index");
   }
}

Сейчас я достигаю этогос некоторыми обходными путями. Но я чувствую, что это нехорошо. Скажите, пожалуйста, как я могу добиться этого правильным образом? СпасибоInvoiceReport.cshtml

@model eItemBox.Web.Models.InvoiceReportViewModel
@{
    Layout = null;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + Model.InvoiceBillName);
    //Content-Disposition is defined in RFC-2183
}
<Worksheet ss:Name="MyInvoice">
.
.
.

</Workbook>

1 Ответ

0 голосов
/ 10 декабря 2011

Полагаю, ваш вопрос очень похож на этот вопрос . Единственное отличие состоит в том, что вам нужно сохранить выходные данные в формате Excel, а не отправлять их по электронной почте.

Пожалуйста, попробуйте использовать метод RenderViewToString из приведенного выше вопроса:

public virtual string RenderViewToString(
  ControllerContext controllerContext,
  string viewPath,
  string masterPath,
  ViewDataDictionary viewData,
  TempDataDictionary tempData)
{
  Stream filter = null;
  ViewPage viewPage = new ViewPage();

  //Right, create our view
  viewPage.ViewContext = new ViewContext(controllerContext, new WebFormView(viewPath, masterPath), viewData, tempData);

  //Get the response context, flush it and get the response filter.
  var response = viewPage.ViewContext.HttpContext.Response;
  response.Flush();
  var oldFilter = response.Filter;

  try
  {
      //Put a new filter into the response
      filter = new MemoryStream();
      response.Filter = filter;

      //Now render the view into the memorystream and flush the response
      viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
      response.Flush();

      //Now read the rendered view.
      filter.Position = 0;
      var reader = new StreamReader(filter, response.ContentEncoding);
      return reader.ReadToEnd();
  }
  finally
  {
      //Clean up.
      if (filter != null)
      {
        filter.Dispose();
      }

      //Now replace the response filter
      response.Filter = oldFilter;
  }
}

UPDATE: Другой (немного другой) способ сделать это можно найти здесь

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