मैं दो अलग-अलग विचारों (एक स्ट्रिंग के रूप में जिसे एक ईमेल के रूप में भेजा जाएगा), और दूसरा पृष्ठ उपयोगकर्ता को प्रदर्शित करना चाहता हूं।
क्या यह ASP.NET MVC बीटा में संभव है?
मैंने कई उदाहरण आज़माए हैं:
1. ASP.NET MVC बीटा में स्ट्रिंग के लिए RenderPartial
अगर मैं इस उदाहरण का उपयोग करता हूं, तो मुझे "HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है"।
2. एमवीसी फ्रेमवर्क: एक दृश्य के आउटपुट को कैप्चर करना
यदि मैं इसका उपयोग करता हूं, तो मैं पुनर्निर्देशन करने में असमर्थ प्रतीत होता हूं, क्योंकि यह उस दृश्य को प्रस्तुत करने का प्रयास करता है जो मौजूद नहीं हो सकता है। यदि मैं दृश्य वापस करता हूं, तो यह पूरी तरह से गड़बड़ है और बिल्कुल भी सही नहीं लगता है।
क्या किसी के पास इन मुद्दों के लिए कोई विचार / समाधान है, या बेहतर लोगों के लिए कोई सुझाव है?
बहुत धन्यवाद!
नीचे एक उदाहरण है। मैं जो करने की कोशिश कर रहा हूं वह 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);
}
टिम स्कॉट से स्वीकार किए गए उत्तर (मेरे द्वारा थोड़ा स्वरूपित और परिवर्तित):
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);