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