2008-12-10 69 views
0

我一直在努力解決一些與在FormView中引用子控件有關的問題。另一位開發人員編寫了一個正在編譯和工作的ASPX頁面,並且在該代碼中,他將FormView 中的子控件作爲頁面對象的屬性直接引用。該頁面是ASP.NET Web SITE項目的一部分(而不是Web應用程序項目)。我們決定將該項目轉換爲Web應用程序項目模型,並注意到這些屬性引用現在不能編譯。文件後面的代碼不會在窗體視圖中生成控件。ASP.NET根據頁面內容編譯行爲更改?

在研究這個問題時(我在這裏有一個關於這些問題的單獨帖子),我遇到了一些令人困惑的事情。從我讀過的所有文章中,您應該總是使用需要使用FindControl引用FormView模板中的子控件 - 也就是說,無論您是否在Web站點中,都無法通過簡單的生成屬性進行操作項目模型或Web應用程序項目模型。

我對我的同事的代碼編譯和運行感到困惑。正如我所指出的,他通過頁面中的簡單屬性來引用FormView包含的子控件,並且不必求助於FindControl調用。爲了解開這個謎團的底部,我製作了演示這種現象的最簡單的例子。

我發現的東西很奇怪。我在這裏的代碼有一個ASP:FormView,它的ItemTemplate中有一些標籤控件。其中一個標籤有ID MyComment。當FormView數據綁定(到Northwind的Products表)時,我只需設置一些文本。

using System; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.FormView1.ChangeMode(FormViewMode.ReadOnly); 
    } 
    protected void FormView1_DataBound(object sender, EventArgs e) { 
     MyComment.Text = "Data bound at " + DateTime.Now.ToString(); 
    } 
} 

此代碼不會編譯,因爲MyComment不是有效的屬性。這裏出現了奇怪的部分。 如果我在FormView的ItemTemplate中嵌入Ajax控件工具包庫中的TabContainer控件,上面的代碼會編譯並正確運行

所以我的同事的代碼編譯的原因是因爲在FormView內嵌入了TabContainer控件?爲什麼這應該改變編譯器的行爲,以及可以訪問FormView的子控件的機制對我來說是個謎。順便說一句,儘管它編譯乾淨並且運行正常,但Intellisense沒有看到這些屬性,ReSharper將它們報告爲編譯錯誤(通過指示條中的紅燈)。

這是頁面的標記。任何人都可以闡明這種行爲?順便說一下,我並不抱怨ASP.NET在這種情況下創建這些屬性的事實。 (不幸的是,如果項目是Web站點項目,這種快樂但奇怪的行爲似乎只適用;作爲Web應用程序項目,即使使用嵌入式TabControl,屬性訪問器也不能在FormView中工作)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div> 
     <asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID" DataSourceID="SqlDataSource1" 
      OnDataBound="FormView1_DataBound"> 
      <ItemTemplate> 
       <ajaxToolkit:TabContainer runat="server" ID="TabsItem"> 
        <ajaxToolkit:TabPanel runat="Server" ID="PanelBasicsItem" HeaderText="Basics"> 
         <ContentTemplate> 
          ProductID: 
          <asp:Label ID="ProductIDLabel" runat="server" Text='<%# Eval("ProductID") %>' /> 
          <br /> 
          ProductName: 
          <asp:Label ID="ProductNameLabel" runat="server" Text='<%# Bind("ProductName") %>' /> 
          <br /> 
          My Comment: 
          <asp:Label ID="MyComment" runat="server"></asp:Label> 
          <br /> 
         </ContentTemplate> 
        </ajaxToolkit:TabPanel> 
       </ajaxToolkit:TabContainer> 
      </ItemTemplate> 
     </asp:FormView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
      SelectCommand="SELECT [ProductID], [ProductName] FROM [Alphabetical list of products]"> 
     </asp:SqlDataSource> 
    </div> 
    </form> 
</body> 
</html> 

回答

0

當您轉換網頁網站到Web應用程序,你檢查的部分類爲您的aspx文件被正確生成(如應該有一個叫「Default.aspx.cs文件.designer「,在您的Web應用程序的Default.aspx和Default.aspx.cs文件下)。

在Web 網站,這些都是由服務器動態生成的網站上運行,並且編譯(所以不要在你的項目中存在),而在Web應用程序他們創建和由Visual Studio管理 - 如果它們不存在,則代碼可能無法編譯,因爲對象沒有被安裝 - 您看到的實際編譯器錯誤是什麼?

在將項目轉換爲Web應用程序後,通過向頁面添加一個新控件,迫使VS創建缺少的部分類。

0

Zhaph,

謝謝您的回覆。是的,設計師檔案在那裏。我想我的問題太多了,並且把問題搞糊塗了。令人費解的行爲在Web SITE項目中得到證明。

底線是,在FormView中的屬性將無法編譯除非在FormView中有一箇中間TabContainer控件。如果TabContainer在那裏,那麼屬性就會編譯和工作。如果從FormView中刪除TabContainer,代碼將不會編譯。很奇怪。到目前爲止,沒有人能解釋這一點。