2009-03-04 13 views
0

WebFormViewEngine'ı genişletmek istiyorum, böylece bazı post-processing işlemleri yapabilirim - bunu bir şeyler yapmak istiyorum, sonra bana Html'yi geri verin, böylece bazı son rötuşlar yapabilirim. ViewData'ya erişmem gerektiğinden View/ViewEngine olarak yapılması gerekiyor.MVC'de WebFormView'ı Genişletme

Ne yazık ki Html'yi WebFormView'dan geri almak ve WebFormView'a veya ViewPage'e özel bir HtmlTextWriter vermenin bir yolu yok gibi görünüyor.

Elbette bunu yapmanın bir yolu var mı? Yok hayır?

Littlecharva

cevap

2

Bunu yapmak için Eylem Filtrelerini kullanabilirsiniz. Asp.net/mvc adresinden this tutorial göz atın. ResultsFilter kullanmak istiyorsunuz.

Alternatif olarak, Denetleyicinin sanal OnResultExecuted yöntemini geçersiz kılabilirsiniz.

+0

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

+0

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

0

Tamam, bunu daha önce hiç yapmadım ama reflektör ve MVC meclisleri aracılığıyla görünüyordu. Görünüşe göre, ViewPage ve ViewPage ve ViewMasterPage nesnelerini nesneyle genişletmek mümkün olabilir. Kendi nesnenizde render yöntemini geçersiz kılabilir ve HtmlTextWriter'e bir tutamaç alabilirsiniz. Sonra sadece üsse aktarın ve yapmasına izin verin. Bunun gibi bir şey (bu test edilemez ve sadece teoriktir, geçersiz kılmanız gereken daha fazla yöntem olabilir.) Reflektörün şimdi nasıl yapıldığını ve Spark gibi diğer görünüm motorlarının nasıl yaptığını görmek için kullanmanızı tavsiye ederim.

public class MyPage : ViewPage 
{ 
    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     //Do custom stuff here 
     base.Render(writer); 
    } 
} 
public class MyPage<TModel> : MyPage where TModel : class 
{ 
} 
+0

ben reflektör kullanılan ve rota soruşturttun, sorun WebViewEngine varsayılan bir yerine benim ViewPage örneğini için hiçbir yolu olmalı görünmesidir. Bir BuildManager kullanıyor gibi görünüyor, ancak BuildManager'ı kontrol etmek için açık bir yol yoktur. – littlecharva

1

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); 
    } 
}