2012-03-16 40 views
3

我想將Web表單的所有輸出(從.NET 3.5的aspx和aspx.cs)序列化爲JSON。所以,這是我的代碼:覆蓋Render方法的問題

protected string myText; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    myText = "<div><span>This is my whole code</span><div><a style=\"color:blue !important;\" href=\"#\">A link</a></div></div>"; 
} 

protected internal override void Render(HtmlTextWriter writer) 
{ 
    var serializer = new JavaScriptSerializer(); 
    Response.Write(Request["callback"] + serializer.Serialize(writer.ToString())); 
} 

,但我得到這個錯誤:

CS0507: 'moduli_Prova.Render(System.Web.UI.HtmlTextWriter)': cannot change access modifiers when overriding 'protected' inherited member 'System.Web.UI.Control.Render(System.Web.UI.HtmlTextWriter)' 

我在哪裏錯了?這是做這件事的正確方法嗎?

回答

10

我不認爲你在覆蓋

protected override void Render(HtmlTextWriter writer) 

覆蓋在派生類中的虛方法 時,我們不能修改訪問修飾符有internal

重寫聲明不能更改虛擬方法的可訪問性。但是,如果重寫的基本方法受到內部保護 的保護,並且在與包含覆蓋方法的程序集 不同的程序集中聲明,則必須保護覆蓋方法的聲明 可訪問性。

參考here

也許是這樣的:

protected override void Render (HtmlTextWriter writer) 
{ 
    StringBuilder sb = new StringBuilder(); 
    HtmlTextWriter tw = new HtmlTextWriter(new System.IO.StringWriter(sb)); 
    //Render the page to the new HtmlTextWriter which actually writes to the stringbuilder 
    base.Render(tw); 

    //Get the rendered content 
    string sContent = sb.ToString(); 

    //Now output it to the page, if you want 
    writer.Write(sContent); 
} 

編輯

我們知道,所有頁面從page繼承。我們也知道,一個新的htmltextwriter收進在構造器中具有stringbuilderstringwriter。然後我們調用基類(page)將html呈現給我們新的HtmlTextWriter。它也呈現也呈現給stringbuilder。所以現在我們在我們的stringbuilder有html上下文。然後,我們只需要輸入HtmlTextWriter即可從我們的stringbuilder中編寫string

參考here

+0

對!但不幸的是,這個print'request?「System.Web.UI.HtmlTextWriter」',而不是Web表單的輸出轉換爲JSON:O – markzzz 2012-03-16 10:54:35

+1

@markzzz,因爲你正在寫對象本身,而不是輸出。 – 2012-03-16 10:56:31

+0

uhm?那麼,我怎樣才能得到輸出?從這個對象,我想?我沒有看到這樣做的任何方法... – markzzz 2012-03-16 10:57:49