我一直在努力解決一些與在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>