ฉันต้องการแสดงผลสองมุมมองที่แตกต่างกัน (อันหนึ่งเป็นสตริงที่จะถูกส่งเป็นอีเมล) และอีกหน้าที่แสดงให้ผู้ใช้เห็น
เป็นไปได้ใน ASP.NET MVC เบต้าหรือไม่
ฉันลองหลายตัวอย่าง:
1. RenderPartial เป็น String ใน ASP.NET MVC Beta
หากฉันใช้ตัวอย่างนี้ฉันจะได้รับ "ไม่สามารถเปลี่ยนเส้นทางหลังจากส่งส่วนหัว HTTP"
2. MVC Framework: การจับภาพเอาต์พุตของมุมมอง
หากฉันใช้สิ่งนี้ฉันดูเหมือนจะไม่สามารถทำการเปลี่ยนเส้นทางไปยังการกระทำได้เนื่องจากพยายามแสดงมุมมองที่อาจไม่มีอยู่ ถ้าฉันกลับมาดูมันจะเลอะเทอะและไม่ได้ดูเลย
ไม่มีใครมีความคิด / แนวทางแก้ไขสำหรับปัญหาเหล่านี้ที่ฉันมีหรือมีคำแนะนำใด ๆ
ขอบคุณมาก!
ด้านล่างเป็นตัวอย่าง สิ่งที่ฉันพยายามทำคือสร้างเมธอด 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);
}
คำตอบที่ยอมรับจาก Tim Scott (เปลี่ยนแปลงและจัดรูปแบบเล็กน้อยโดยฉัน):
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;
}
}
ตัวอย่างการใช้งาน
สมมติว่ามีการโทรจากคอนโทรลเลอร์เพื่อรับอีเมลยืนยันการสั่งซื้อผ่านตำแหน่ง Site.Master
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);