WebFormView sınıfının Render yöntemini geçersiz kılarak Görünüm işlenmeden önce alınan çıktıyı yakalayabilirsiniz. Hile, çıktı alıcısının System.IO.TextWriter yazıcısı değil, viewContext'in Writer özelliği olmasıdır. Ayrıca, görüşlerinizi geri yüklemek için WebFormViewEngine öğesini genişletmeniz gerekir.
public class MyViewEngine : WebFormViewEngine
{
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
return new MyView(partialPath, null);
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
return new MyView(viewPath, masterPath);
}
}
public class MyView : WebFormView
{
public MyView(string inViewPath, string inMasterPath) : base(inViewPath, inMasterPath) { }
public MyView(string inViewPath) : base(inViewPath) { }
public override void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
//make a switch to custom output receiver
var oldWriter = viewContext.Writer;
viewContext.Writer = new System.IO.StringWriter();
base.Render(viewContext, null);
viewContext.Writer.Close();
//get output html
var html = ((System.IO.StringWriter)viewContext.Writer).GetStringBuilder();
//perform processing
html.Replace('a', 'b');
//retransmit output
viewContext.Writer = oldWriter;
viewContext.Writer.Write(html);
}
}
Teşekkürler, bu beni olmak istediğim yere biraz daha yakınlaştırıyor. İşlem Filtrelerini kullanmak veya OnResultExecuted'i geçersiz kılmak için ne istediğimi anlayabiliyorum, ancak TÜM görünümlerde çalıştırılacağı için yazdığım kodun ViewEngine içinde olduğunu hissediyorum. – littlecharva
THIS uygulamasında tüm görünümlerde çalışabilir, ancak her uygulamada olmayabilir. Her proje için çerçeveyi değiştirmek istemezsiniz. – Matthew