【问题标题】:ASP.NET Compile behavior changes depending on page content?ASP.NET 编译行为根据页面内容而变化?
【发布时间】:2009-06-22 00:00:02
【问题描述】:

我一直在努力解决与在 FormView 中引用子控件有关的一些问题。另一位开发人员编写了一个正在编译和工作的 ASPX 页面,在该代码中,他将 FormView 中的子控件 直接 引用为页面对象的属性。该页面是 ASP.NET 网站项目(与 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 控件工具包库的 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>

【问题讨论】:

    标签: asp.net visual-studio-2008


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 2012-10-03
      • 2011-11-07
      • 2013-10-19
      • 1970-01-01
      • 2020-10-08
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多