Tôi muốn xuất ra hai chế độ xem khác nhau (một dạng chuỗi sẽ được gửi dưới dạng email) và trang kia hiển thị cho người dùng.
Điều này có thể có trong ASP.NET MVC beta không?
Tôi đã thử nhiều ví dụ:
1. RenderPartial to String trong ASP.NET MVC Beta
Nếu tôi sử dụng ví dụ này, tôi sẽ nhận được "Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi."
2. Khung MVC: Chụp đầu ra của khung nhìn
Nếu tôi sử dụng điều này, tôi dường như không thể thực hiện chuyển hướng, vì nó cố gắng hiển thị chế độ xem có thể không tồn tại. Nếu tôi quay lại chế độ xem, nó hoàn toàn bị rối và trông không ổn chút nào.
Có ai có bất kỳ ý tưởng / giải pháp cho những vấn đề này tôi có, hoặc có bất kỳ đề xuất cho những vấn đề tốt hơn?
Cảm ơn nhiều!
Dưới đây là một ví dụ. Những gì tôi đang cố gắng làm là tạo phương thức 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);
}
Câu trả lời được chấp nhận từ Tim Scott (được tôi thay đổi và định dạng một chút):
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;
}
}
Ví dụ sử dụng
Giả sử một cuộc gọi từ bộ điều khiển để nhận email xác nhận đơn hàng, đi qua vị trí Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);