2011-08-16 24 views
4

我在ASP.NET窗體應用程序中使用自定義Web控件時出現了一個奇怪的問題。ASP.NET Web控件在第一次回發後顯示舊數據

對於Web應用程序,我想,這將節省我很多時間來創建一個類從CompositeControl繼承它結合了其他一些控制的標籤,如TextBoxDropDownList。此複合控件具有幾個屬性,它們包裝基礎屬性的屬性(例如:EnteredText包裝TextBox.Text)。這些控件可用於數據綁定方式與常規方式相同,但您可以使用compositeControl.EnteredText = someObject.someProperty而不是txtBox.Text = someObject.someProperty。 這些控件隨後在ASPX頁面和ASCX用戶控件上使用。

Web控件的第一個版本是用C#編寫的,並且完美地工作。這些控件放置在網站的App_Code folder中。然而,這個文件夾變得相當大,並且由於策略,我必須在VB.NET中編寫所有內容,所以我決定創建一個類庫來將控件的VB.NET版本放在那裏,這樣我就沒有將整個Web應用程序轉換爲VB.NET,但僅限於控件。

但是,VB.NET的版本的確不是,而是的工作。當我點擊GridView中的鏈接時,它會打開一個彈出窗口並正確填充所有文本框。關閉屏幕並單擊來自同一網格的其他鏈接時,這些框未正確填充,並且第一次回發的數據在框中可見。使用調試器時,我看到所有框都填充了正確的數據,並且在呈現階段,底層TextBox的Text屬性顯示了所有新數據。它只是不顯示在屏幕上。在回發後檢索數據,如按下保存按鈕時,正常工作。

當我將App_Code folder的控件放在同一頁面上時,它按預期工作,並顯示新數據而不是來自上一回發的數據。

這裏有兩個粘貼bin網址,第一個轉到工作的C#版本,第二個轉到VB.NET版本。

C#版本:http://pastebin.com/SuWaHrMt

VB.NET版本:http://pastebin.com/9aeV7St1

下面是一個例子它是如何在一個ASCX文件中使用:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" Inherits="Controls_CustomControl" %> 
<%@ Register Namespace="UI.CompositeControls" TagPrefix="cs" %> 

<cs:TextBoxWithLabel ID="TextBoxWithLabel1" runat="server" LabelText="Voornaam" /> 
<cc:LabeledTextBox ID="tbwlVoornaam" runat="server" LabelText="Voornaam" /> 

抄送前綴在網頁中指定。配置:

<pages theme="Default" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"> 
    <controls> 
    <add assembly="CompositeControls" namespace="CompositeControls" tagPrefix="cc" /> 
    </controls> 
    <namespaces> 
    <add namespace="CompositeControls" /> 
    </namespaces> 
</pages> 

我在想她e使C#版本工作和VB版本不工作?

在此先感謝!如果您想要澄清一些問題,請隨時提問。

更新: 我禁用ViewState中對有問題的涵蓋ASCX和它的作品:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" EnableViewState="false" Inherits="Controls_CustomControl" %> 

我的同事發現了下面的代碼片段:

如果重新插入控件與每個往返,動態創建的每一代控件都會從上一組控件的視圖 狀態中選取屬性值。在很多情況下,您可以通過將容器控件的EnableViewState屬性設置爲 false來避免此問題 問題。在那種情況下,沒有關於動態控件的信息被保存,並且與控件的連續版本不存在衝突。

我只是不知道這突然如何適用於控件。根據this MSDN article on ViewState我猜這是因爲控件添加在發生在回發事件之後的CreateChildControls方法中。

有人可以解釋這裏究竟發生了什麼嗎?

+0

我認爲你對這個問題的解決方案清楚地表明它是一個Viewstate問題。您需要了解ASP.NET視圖狀態如何適用於窗體和用戶控件。如果您需要覆蓋viewstate的默認行爲,只需將其關閉(使用EnableViewState =「false」) –

+0

@Julius Wat迴避了我是如何在VB.NET版本中出現問題,而不是C#版本。我沒有重寫默認的ViewState行爲,也不需要。說實話,這不像是一種解決方案,因爲我有一個可行的版本。從我收集的內容來看,ViewState僅用於存儲以編程方式更改的控件的屬性,以便在回發期間保留它的屬性。 – user849924

回答

1

在哪些瀏覽器中遇到問題? 我最近在Firefox中遇到了類似的問題,只是通過禁用Firebug緩存解決了這個問題。 (http://i.stack.imgur.com/bRRjb.jpg)

+0

Internet Explorer 8.0,Chrome 13.0.782.112,Firefox 4.0,Opera 11.50。這裏和我們的客戶使用的主要瀏覽器。 – user849924

相關問題