ASP.NET编译行为会根据页面内容而改变吗?

时间:2008-12-10 22:31:43

标签: asp.net visual-studio-2008

我一直在努力解决与在FormView中引用子控件有关的一些问题。另一位开发人员编写了一个正在编译和工作的ASPX页面,在该代码中,他将FormView 中的子控件直接引用为页面对象的属性。该页面是ASP.NET Web SITE项目的一部分(与Web应用程序项目相对)。我们决定将项目转换为Web应用程序项目模型,并注意到这些属性引用现在不能编译。后面的代码文件不会在表单视图中生成控件。

在研究这个问题时(我在这里就这些问题单独发帖),我遇到了令人困惑的事情。从我读过的所有帖子中,你应该总是需要使用FindControl引用FormView模板中的子控件 - 也就是说,无论你是否通过一个简单的生成属性都不可能做到这一点在网站项目模型或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 Control Toolkit库的TabContainer控件,则上面的代码会编译并正确运行

所以我的同事的代码编译的原因是因为FormView中嵌入了TabContainer控件?为什么这应该改变编译器的行为以及可以访问FormView的子控件的机制对我来说是一个谜。顺便说一句,尽管它干净地编译并正确运行,但Intellisense没有看到这些属性,ReSharper将它们报告为编译错误(通过指示条中的红灯)。

这是页面的标记。任何人都可以对这种行为有所了解吗?顺便说一句,我并不是在抱怨ASP.NET在这种情况下创建这些属性的事实。 (不幸的是,这种快乐,但很奇怪的行为,似乎只适用于项目是网站项目;作为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>

1 个答案:

答案 0 :(得分:0)

当您将网站网站转换为网络应用时,您是否检查了为您的aspx文件正确生成的部分类(例如,应该有一个名为Web应用程序中的“Default.aspx.cs.designer”,在Default.aspx和Default.aspx.cs文件下。)

在网站网站中,当网站运行时,服务器会动态生成这些内容并进行编译(在项目中不存在),而在网络中应用程序它们是由Visual Studio创建和管理的 - 如果它们不存在,那么代码可能无法编译,因为对象尚未实例化 - 您看到的实际编译器错误是什么?

通过在将项目转换为Web应用程序后向页面添加新控件,您将强制VS创建缺少的部分类。