ASP.NET Компиляция поведения меняется в зависимости от содержимого страницы?

Я боролся с некоторыми проблемами, связанными со ссылками на дочерние элементы управления в FormView. Другой разработчик написал ASPX-страницу, которая компилируется и работает, и в этом коде он ссылается на дочерние элементы управления в FormView непосредственно как свойства объекта страницы. Страница является частью проекта веб-сайта ASP.NET (в отличие от проекта веб-приложения). Мы решили преобразовать проект в модель проекта веб-приложения и заметили, что эти ссылки на свойства теперь не компилируются. Код файла не генерирует элементы управления в представлении формы.

Исследуя эту проблему (у меня был отдельный пост об этих проблемах), я столкнулся с чем-то непонятным. Из всех постов, которые я прочитал, вы всегда должны ссылаться на дочерние элементы управления в шаблоне FormView, используя FindControl - то есть, якобы, это невозможно сделать с помощью простого сгенерированного свойства, независимо от того, находитесь ли вы в модели проекта веб-сайта. или модель проекта веб-приложения.

Я был озадачен тем, как код моего коллеги компилировался и работал. Как я указывал, он ссылается на дочерние элементы управления FormView через простые свойства на странице и ему не пришлось прибегать к вызовам FindControl. Итак, чтобы докопаться до этой тайны, я приготовил кратчайший пример, демонстрирующий это явление.

То, что я нашел, было очень странным. Код, который я здесь имею, имеет ASP: FormView с несколькими элементами управления метками в его ItemTemplate. Один из этих ярлыков имеет идентификатор MyComment . Когда данные FormView связываются (с таблицей продуктов Northwind), я просто устанавливаю некоторый текст.

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 не является допустимым свойством. Здесь начинается странная часть. Если я встраиваю в FormT ItemTemplate элемент управления TabContainer из библиотеки Ajax Control Toolkit, приведенный выше код компилируется и работает правильно .

Итак, причина, по которой код моего коллеги компилируется, заключается в том, что встроенный элемент управления TabContainer в FormView ?? Почему это должно изменить поведение компилятора и механизмы, с помощью которых вы можете получить доступ к дочерним элементам управления FormView, для меня загадка. Между прочим, несмотря на то, что он правильно компилируется и работает, Intellisense не видит эти свойства, а ReSharper сообщает о них как об ошибках компиляции (красным светом на панели индикаторов).

Вот разметка для страницы. Кто-нибудь может пролить свет на это поведение? Кстати, я не жалуюсь на тот факт, что ASP.NET создает эти свойства в этих обстоятельствах. (К сожалению, это счастливое, но странное поведение, похоже, применимо, только если проект является проектом веб-сайта; в качестве проекта веб-приложения средства доступа к свойствам не работают в FormView даже со встроенным TabControl).

<!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>
10.12.2008 22:31:43
1 ОТВЕТ

Когда вы конвертировали веб- сайт в веб- приложение , проверяли ли вы, что частичные классы были правильно созданы для ваших файлов aspx (например, в вашем веб-приложении должен быть файл с именем «Default.aspx.cs.designer» в разделе «По умолчанию»). файлы .aspx и Default.aspx.cs).

На веб- сайте они создаются сервером на лету, когда ваш сайт работает и компилируется (и поэтому не существует в вашем проекте), тогда как в веб- приложении они создаются и управляются Visual Studio - если они не работают. не существует, то код потенциально не сможет скомпилироваться, потому что объекты еще не были установлены - что вы видите на самом деле - ошибка компилятора?

Добавляя новый элемент управления на страницу после преобразования проекта в веб-приложение, вы заставляете VS создавать неполный класс, который отсутствует.

0
11.12.2008 15:41:04