ASP.NET Компиляция поведения меняется в зависимости от содержимого страницы? - PullRequest
0 голосов
/ 11 декабря 2008

Я боролся с некоторыми проблемами, связанными со ссылками на дочерние элементы управления в 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>

1 Ответ

0 голосов
/ 11 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...