Bir Render bir dize olarak
Çıkış için iki farklı görüş (e-posta olarak gönderilecek bir dize olarak) istiyorum, ve bu sayfa başka bir kullanıcı için görüntülenir.
Bu ASP.NET MVC beta mümkün mü?
Birden çok örnek denedim:
RenderPartial to String in ASP.NET MVC Beta
MVC Framework: Capturing the output of a view
Herkes bu sorunlar için çözümler/herhangi bir fikrim yok, ya da daha iyileri için herhangi bir öneriniz var mı?
Çok teşekkürler!
Aşağıda bir örnek. Yapmaya çalıştığım şey GetViewForEmail yöntemi oluşturun
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 gelen cevap (ve bana göre biraz değişti biçimlendirilmiş) kabul:
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;
}
}
Örnek kullanım
Sipariş onay almak için denetleyici bir çağrı varsayarsak, Site geçen e-posta.Ana konum.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);
CEVAP
Buraya kadar geldim, ve benim için işe yarıyor. Aşağıdaki yöntem(ler) denetleyicisi temel dersime ekledim. (Her zaman bu statik yöntemler sanırım bir parametre olarak kabul eden bir denetleyici başka bir yerde yapın)
MVC2 .ascx tarzı
protected string RenderViewToString<T>(string viewPath, T model) {
ViewData.Model = model;
using (var writer = new StringWriter()) {
var view = new WebFormView(ControllerContext, viewPath);
var vdd = new ViewDataDictionary<T>(model);
var viewCxt = new ViewContext(ControllerContext, view, vdd,
new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
Jilet .cshtml tarzı
public string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
Edit: Razor kod eklendi.
Nasıl bir dize olarak adını aldığımda ...
JSON dize olarak seri numaralama...
Nasıl sınırlayıcı olarak herhangi bir ...
Nasıl bir dize olarak yöntem adı veril...
Neden Java'In hashCode() Dize çar...