自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解WebFormView中標(biāo)準(zhǔn)修改辦法

開發(fā) 后端
這里將介紹WebFormView中標(biāo)準(zhǔn)修改辦法及MvcPatch項目,這些都與Ajax有關(guān),希望本文能對大家有關(guān)。

對于WebFormView的標(biāo)準(zhǔn)修改辦法以及MvcPatch項目,這些東西的好處是如果我們在構(gòu)建一個面向AJAX請求的Action,此時View的內(nèi)容可能只是輸出的一部分,甚至我們要對內(nèi)容進(jìn)行過濾/編碼等額外操作。

淺析WebFormView中的一個Bug中我提到WebFormView的實現(xiàn)破壞了IView對象設(shè)計思路,它會把視圖內(nèi)容直接生成至HttpContext.Current而不是Render方法指定的TextWriter中。目前,WebFormView.Render的調(diào)用方只有兩個:ViewResult.ExecuteResult方法還有HtmlHelper.RenderPartial方法,但是這兩者原本的目的地就是當(dāng)前的HttpContext,因此在平時使用時WebFormView的錯誤實現(xiàn)并不會造成問題。

  1. public static class HtmlExtensions  
  2. {  
  3. public static string Partial(this HtmlHelper htmlHelper, string partial)  
  4. {  
  5. var viewInstance = BuildManager.CreateInstanceFromVirtualPath(partial, typeof(object));  
  6. var control = viewInstance as ViewUserControl;  
  7.  
  8. control.ViewContext = htmlHelper.ViewContext;  
  9. control.ViewData = htmlHelper.ViewData;  
  10.  
  11. Page page = new ViewPage();  
  12. page.Controls.Add(control);  
  13.  
  14. TextWriter writer = new StringWriter();  
  15. htmlHelper.ViewContext.HttpContext.Server.Execute(page, writer, false);  
  16.  
  17. return writer.ToString();  
  18. }  

但是,如果我們在構(gòu)建一個面向AJAX請求的Action,此時View的內(nèi)容可能只是輸出的一部分,甚至我們要對內(nèi)容進(jìn)行過濾/編碼等額外操作。此時,我們就希望指定一個TextWriter用于收集內(nèi)容——但是WebFormView自然無法做到。之前我提出了一種非常臨時,非常山寨,非常簡陋,繞彎,但是可行,或者說是可以“表現(xiàn)出解決問題的方法”的代碼,修改一下便能說明問題:

這個HtmlHelper的擴(kuò)展方法Partial,和HtmlHelper自帶的RenderPartial功能比較接近,不過Partial是將視圖內(nèi)容直接生成一個字符串并返回,RenderPartial方法是直接輸出至當(dāng)前HttpContext。因此它們在視圖中的使用方式是不同的:

<% Html.RenderPartial("MyPartialView"); %>
<%= Html.Partial("MyPartialView") %>RenderPartial以<%開頭,末尾有分號。而Partial以<%=開頭,末尾沒有分號。關(guān)于視圖中的各種輸出方式,我最近在閱讀ASP.NET源代碼時有更深的了解,下次我們再詳談。不過目前,我們還是專注于WebFormView的修改。

WebFormView目前問題的主要原因,是ViewPage和ViewUserControl兩個類中缺乏合適接口的原因:

  1. public class ViewPage : Page, IViewDataContainer {  
  2. ...  
  3. public virtual void RenderView(ViewContext viewContext) {  
  4. ViewContext = viewContext;  
  5. InitHelpers();  
  6. // Tracing requires Page IDs to be unique.  
  7. ID = Guid.NewGuid().ToString();  
  8. ProcessRequest(HttpContext.Current);  
  9. }  
  10. }  
  11.  
  12. public class ViewUserControl : UserControl, IViewDataContainer {  
  13. ...  
  14. public virtual void RenderView(ViewContext viewContext) {  
  15. viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);  
  16. // 這是ViewPage的子類,專用于生成獨立的ViewUserControl內(nèi)容  
  17. var containerPage = new ViewUserControlContainerPage(this);  
  18. // Tracing requires Page IDs to be unique.  
  19. ID = Guid.NewGuid().ToString();  
  20.  
  21. // 其中會執(zhí)行ViewUserControlContrainerPage的RenderView方法  
  22. RenderViewAndRestoreContentType(containerPage, viewContext);  
  23. }  

可見,在ViewPage和ViewUserControl中各有一個RenderView方法,它們只包含一個ViewContext參數(shù),但是卻沒有輸出目的地。因此,最終它們使用HttpContext.Current這個邪惡的、臭名昭著的靜態(tài)屬性來生成內(nèi)容。現(xiàn)在想起來,我當(dāng)時在搞異步Action時,遭遇異常而不得不手動保持HttpContext就是這個原因造成的。于是我們目前修改的方式,便是為ViewPage和ViewUserControl增加一個額外的TextWriter參數(shù):

  1. public class ViewPage : Page, IViewDataContainer {  
  2. ...  
  3. public virtual void RenderView(ViewContext viewContext, ViewContext writer) {  
  4. ViewContext = viewContext;  
  5. InitHelpers();  
  6. // Tracing requires Page IDs to be unique.  
  7. ID = Guid.NewGuid().ToString();  
  8. ProcessRequest(HttpContext.Current);  
  9. viewContext.HttpContext.Server.Execute(this, writer, false);  
  10. }  
  11. }  
  12.  
  13. public class ViewUserControl : UserControl, IViewDataContainer {  
  14. ...  
  15. public virtual void RenderView(ViewContext viewContext, ViewContext writer) {  
  16. viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);  
  17. var containerPage = new ViewUserControlContainerPage(this);  
  18. // Tracing requires Page IDs to be unique.  
  19. ID = Guid.NewGuid().ToString();  
  20.  
  21. RenderViewAndRestoreContentType(containerPage, viewContext, writer);  
  22. }  

至于其他“順其自然”的修改就不值一提了。

在我看來,這種問題可能不是ASP.NET MVC的設(shè)計問題(Design Issue),但是這也是它的內(nèi)部實現(xiàn)的低級錯誤。對于此類問題,如果使用擴(kuò)展的方式進(jìn)行修改會顯得沉重而麻煩,需要各種擴(kuò)展和配置才能使用。之前項目中使用的便是基于“外部擴(kuò)展”來回避“內(nèi)部錯誤”的辦法,而目前已經(jīng)換成自行修改編譯過的System.Web.Mvc.dll了。這個修改版本目前已經(jīng)發(fā)布在CodePlex中的MvcPatch項目中,如果您感興趣可以獲取它的源代碼并編譯使用。

目前,MvcPatch包含兩個修改,一個自然就是目前WebViewEngine的問題,而另一個便是之前提過的DefaultControllerFactory線程安全問題,以后我會補充更多設(shè)計方面的修改和擴(kuò)展。在使用MvcPatch的時候,除了讓您的項目引用正確的程序集之外,還必須將web.config文件中各類型的名稱指向修改正確。因為使用ASP.NET MVC的模板創(chuàng)建項目時,它的web.config會使用GAC中注冊的強類型的ASP.NET MVC 1.0程序集。如果修改不正確,在使用MvcPatch的程序集時便會遇到錯誤。

因此我們也可以發(fā)現(xiàn),使用MvcPatch的好處在于,我們不需要使用外部擴(kuò)展的方式來構(gòu)建workaround,但是它也有缺點,那就是一些依賴于ASP.NET MVC 1.0程序集的項目無法和我們一起使用了。好在目前看起來這些項目都是些開源產(chǎn)品,如Telerik Extensions for ASP.NET MVC,我們可以下載它們的源代碼,基于MvcPatch的程序集編譯后再使用。

您別嫌麻煩,這就是享受開源的優(yōu)勢時需要付出的小小代價。

***再談一件事情。昨天晚上寫完文章之后,我想到這種“補丁版本”并不是長久之計,因此在CodePlex上給ASP.NET項目提了一個Issue:WebFormView總是輸出至HttpContext.Current而不是指定的TextWriter。今天早上發(fā)現(xiàn)已經(jīng)有了ASP.NET團(tuán)隊成員回復(fù),他們表示內(nèi)部的代碼庫中已經(jīng)修改了這個問題,將會體現(xiàn)在ASP.NET MVC 2的Preview 2版本中。

原文標(biāo)題:WebFormView的標(biāo)準(zhǔn)修改辦法及MvcPatch項目

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/15/standard-webformview-patch-and-MvcPatch-project.html

【編輯推薦】

  1. ASP.NET MVC與WebForm區(qū)別談
  2. 自定義的ControllerFactory:接口實現(xiàn),支持Area
  3. ASP.NET Routing之“解析URL”功能詳解
  4. 為ASP.NET MVC應(yīng)用添加自定義路由
  5. 學(xué)習(xí)ASP.NET MVC路由的使用方法
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-06-15 10:40:14

2010-01-27 16:33:07

C++中標(biāo)準(zhǔn)輸入

2011-03-29 09:14:49

Dispose模式C#

2009-09-14 17:08:02

WebFormView

2010-09-26 09:44:28

JVM啟動參數(shù)

2014-07-22 09:51:19

面板數(shù)據(jù)分析

2015-10-16 09:33:26

TCPIP網(wǎng)絡(luò)協(xié)議

2023-04-02 23:13:07

Go語言bufio

2010-01-12 11:37:34

VB.NET讀取圖像

2011-06-24 15:16:33

Qt 插件

2009-11-05 15:03:02

無線接入網(wǎng)

2009-11-27 09:41:56

LINQ

2009-12-25 10:31:31

Linux網(wǎng)絡(luò)故障

2009-11-30 10:55:16

PHP頁面亂碼

2010-06-02 10:36:41

SVN開發(fā)

2009-11-10 10:24:12

無線網(wǎng)卡設(shè)備

2018-07-24 09:19:31

頂層架構(gòu)區(qū)塊鏈

2023-09-27 08:26:48

Go標(biāo)準(zhǔn)庫函數(shù)

2009-11-03 17:08:23

無線接入網(wǎng)

2012-07-26 09:58:30

Windows 8觸摸鍵盤
點贊
收藏

51CTO技術(shù)棧公眾號