Saya ingin menampilkan dua tampilan berbeda (satu sebagai string yang akan dikirim sebagai email), dan yang lainnya halaman ditampilkan kepada pengguna.
Apakah ini mungkin dalam ASP.NET MVC beta?
Saya sudah mencoba beberapa contoh:
1. RenderPartial to String di ASP.NET MVC Beta
Jika saya menggunakan contoh ini, saya menerima "Tidak dapat mengarahkan ulang setelah tajuk HTTP dikirim."
2. Kerangka MVC: Menangkap output dari tampilan
Jika saya menggunakan ini, saya tampaknya tidak dapat melakukan redirectToAction, karena mencoba membuat tampilan yang mungkin tidak ada. Jika saya mengembalikan tampilan, itu benar-benar kacau dan tidak terlihat benar sama sekali.
Adakah yang punya ide / solusi untuk masalah ini yang saya miliki, atau punya saran untuk yang lebih baik?
Terimakasih banyak!
Di bawah ini adalah contohnya. Apa yang saya coba lakukan adalah membuat metode GetViewForEmail :
public ActionResult OrderResult(string ref)
{
//Get the order
Order order = OrderService.GetOrder(ref);
//The email helper would do the meat and veg by getting the view as a string
//Pass the control name (OrderResultEmail) and the model (order)
string emailView = GetViewForEmail("OrderResultEmail", order);
//Email the order out
EmailHelper(order, emailView);
return View("OrderResult", order);
}
Jawaban yang diterima dari Tim Scott (diubah dan diformat sedikit oleh saya):
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;
}
}
Contoh penggunaan
Dengan asumsi panggilan dari pengontrol untuk mendapatkan email konfirmasi pesanan, melewati lokasi Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);