Пользовательские элементы управления
Обновлен: Ноябрь 2007
Пользовательские элементы управления для мобильных устройств ASP.NET представляют собой быстрый и эффективный способ создания собственных пользовательских элементов управления на веб-странице ASP.NET. Содержимое любой мобильной страницы можно использовать внутри другой мобильной страницы путем комбинирования одного или нескольких элементов управления со связанной логикой и их последующего инкапсулирования в пользовательский элемент. За некоторыми исключениями пользовательский элемент управления идентичен элементу управления MobilePage.
Пользовательский элемент управления для мобильных устройств:
должен иметь расширение имени ASCX-файла;
не требует директивы @ Page;
должен содержать директиву @ Register.
Директива @ Register связывает псевдонимы с пространствами имен и классами, позволяя объявлять элементы управления для мобильных устройств в пользовательском элементе управления.
ASP.NET различает пользовательские и составные элементы управления. Пользовательский элемент управления сохраняется как текстовый файл с расширением ASCX, а составной элемент управления компилируется и сохраняется в сборке. На веб-страницах ASP.NET для мобильных устройств пользовательский элемент управления может содержать несколько элементов управления, что показано в примерах этого раздела.
Создание пользовательского элемента управления
Новый пользовательский элемент управления создается путем создания файла с расширением ASCX. Следующий пример кода включает пользовательский элемент управления, использующий несколько меток для отображения подробных сведений об автомобиле:
<%@ Control Language="VB" ClassName="CarControl"
Inherits="System.Web.UI.MobileControls.MobileUserControl" %>
<%@ Register TagPrefix="mobile"
Namespace="System.Web.UI.MobileControls"
Assembly="System.Web.Mobile" %>
<script runat="server">
' Private field of externally defined CarInfo type
Private _car As New CarInfo()
' Public Property for the CarInfo
Public Property Car() As CarInfo
Get
Return _car
End Get
Set(ByVal value As CarInfo)
_car = value
End Set
End Property
</script>
<mobile:Panel ID="Panel1" Runat="server" BreakAfter="true">
<mobile:Label id="Label1" runat="server" BreakAfter="true">
Make: <%# Car.Make %></mobile:Label>
<mobile:Label id="Label2" runat="server" BreakAfter="true">
Model: <%# Car.Model %></mobile:Label>
<mobile:Label id="Label3" runat="server" BreakAfter="true">
Year: <%# Car.Year %></mobile:Label>
<mobile:Label id="Label4" runat="server" BreakAfter="true">
Color: <%# Car.Color %></mobile:Label>
</mobile:Panel>
<%@ Control Language="C#" ClassName="CarControl"
Inherits="System.Web.UI.MobileControls.MobileUserControl" %>
<%@ Register TagPrefix="mobile"
Namespace="System.Web.UI.MobileControls"
Assembly="System.Web.Mobile" %>
<script runat="server">
// Private field of externally defined CarInfo type
private CarInfo _car = new CarInfo();
// Public Property for the CarInfo
public CarInfo Car
{
get { return _car; }
set { _car = value; }
}
</script>
<mobile:Panel ID="Panel1" Runat="server" BreakAfter="true">
<mobile:Label id="Label1" runat="server" BreakAfter="true">
Make: <%# Car.Make %></mobile:Label>
<mobile:Label id="Label2" runat="server" BreakAfter="true">
Model: <%# Car.Model %></mobile:Label>
<mobile:Label id="Label3" runat="server" BreakAfter="true">
Year: <%# Car.Year %></mobile:Label>
<mobile:Label id="Label4" runat="server" BreakAfter="true">
Color: <%# Car.Color %></mobile:Label>
</mobile:Panel>
Развертывание пользовательского элемента управления
После создания пользовательского элемента управления его можно добавить на веб-страницу ASP.NET для мобильных устройств одним из следующих способов:
путем его регистрации на странице и объявления в разметке;
путем программной загрузки элемента управления на веб-страницу.
Чтобы зарегистрировать пользовательский элемент управления, используйте директиву @ Register. Для программной загрузки элемента управления используйте метод LoadControl.
В следующем примере кода демонстрируется способ декларативной регистрации и использования настраиваемого элемента управления, а также способ программной загрузки пользовательского элемента управления.
<%@ Page Language="VB"
Inherits="System.Web.UI.MobileControls.MobilePage" %>
<%@ Register TagPrefix="mobile"
Namespace="System.Web.UI.MobileControls"
Assembly="System.Web.Mobile" %>
<%@ Register TagPrefix="carp" TagName="CarControl"
Src="~/CarControl.ascx" %>
<script runat="server">
Protected Sub Page_Load( _
ByVal sender As Object, ByVal e As EventArgs)
' Set the existing car control's data
CarCtl.Car = New CarInfo("TreeCars", "Rooter", _
2003, "Tan")
' Load a new car control and set the data
Dim ccar As CarControl = _
CType(Page.LoadControl("~/CarControl.ascx"), _
CarControl)
ccar.ID = "newCarCtl"
' Set the new car control's data
ccar.Car = New CarInfo("TreeCars", "Climber", _
2001, "Green")
' Add the new car control to form2.Controls
form2.Controls.Add(ccar)
' Bind the data and the controls
DataBind()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<mobile:form id="form1" runat="server">
<carp:CarControl ID="CarCtl" runat="server" /><br />
<mobile:Link ID="Link1" Runat="server"
href="#form2" Text="Next" />
</mobile:form>
<mobile:form ID="form2" Runat="server">
<mobile:Link runat="server" id="Link2"
BreakAfter="true"
Text="Return" href="#form1" />
<br />
</mobile:form>
</body>
</html>
<%@ Page Language="C#"
Inherits="System.Web.UI.MobileControls.MobilePage" %>
<%@ Register TagPrefix="mobile"
Namespace="System.Web.UI.MobileControls"
Assembly="System.Web.Mobile" %>
<%@ Register TagPrefix="carp" TagName="CarControl"
Src="CarControl.ascx" %>
<script runat="server">
protected void Page_Load(
object sender, EventArgs e)
{
// Set the existing car control's data
CarCtl.Car = new CarInfo("TreeCars", "Rooter",
2003, "Tan");
// Load a new car control and set the data
CarControl ccar =
(CarControl)Page.LoadControl("~/CarControl.ascx");
ccar.ID = "newCarCtl";
// Set the new car control's data
ccar.Car = new CarInfo("TreeCars", "Climber",
2001, "Green");
// Add the new car control to form2.Controls
form2.Controls.Add(ccar);
// Bind the data and the controls
DataBind();
}
// Toggles the visible form
protected void Command_Click(
object sender, EventArgs e)
{
if (this.ActiveForm == form1)
this.ActiveForm = form2;
else
this.ActiveForm = form1;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<mobile:form id="form1" runat="server">
<carp:CarControl ID="CarCtl" runat="server" /><br />
<mobile:Command ID="Command1" Runat="server"
OnClick="Command_Click">Next</mobile:Command>
</mobile:form>
<mobile:form ID="form2" Runat="server">
<mobile:Command ID="Command2" Runat="server"
OnClick="Command_Click">Return</mobile:Command>
<br />
</mobile:form>
</body>
</html>
Определение URL-адресов
При создании страницы, осуществляющей доступ к пользовательскому элементу управления, который находится в другом каталоге, все относительные URL-адреса в элементе определяются относительно каталога пользовательского элемента, а не относительно каталога страницы. Ниже описан типичный сценарий:
Адрес страницы — /Default.aspx.
Страница содержит пользовательский элемент управления subfolder/UserControl.ascx.
Пользовательский элемент управления, в свою очередь, содержит пользовательский элемент управления B.ascx.
В данной ситуации B.ascx определяется как subfolder/B.ascx. Определение URL-адресов подобным образом позволяет пользовательскому элементу управления инкапсулировать любые требуемые ссылки или другие относительные ресурсы.
Следующие URL-адреса определяются как относительные для пользовательского элемента управления:
Любые URL-адреса переходов — например, URL-адреса для элемента управления Link.
URL-адрес изображения в элементе управления Image.
URL-адрес действия для элемента управления Form.
При создании элементов управления или адаптеров элементов управления необходимо убедиться, что относительные URL-адреса определяются там, где это необходимо. В элементах управления и адаптерах вызовите метод мобильного элемента ResolveUrl для определения URL-адреса, относительного для каталога, содержащего страницу или пользовательский элемент управления. Некоторые вспомогательные методы в базовых классах адаптера автоматически вызывают метод ResolveUrl для определения гиперссылок.
Исключением является ситуация, когда в настраиваемый пользовательский элемент управления включается элемент управления DeviceSpecific, а пользовательский элемент управления ссылается на фильтры устройств, представленные в разделе <deviceFilters> файла Web.config. В этом случае элемент управления использует файл Web.config в каталоге страницы, а не файл Web.config, расположенный в подкаталоге элемента управления.
Форматирование и ссылки в пользовательских элементах управления и ссылках форм
Ссылку на форму можно расположить на той же странице с помощью URL-адреса, который содержит знак решетки (#) и идентификатор формы. В следующем примере кода для указания URL-адреса используется свойство href элемента управления Link.
<mobile:Link ID="Link1" Runat="server"
href="#form2" Text="Next" />
Обычно пользовательский элемент управления вставлен в страницу на верхнем уровне. Страница и пользовательский элемент управления могут содержать одну или несколько форм. Элементы управления на странице и на каждом пользовательском элементе управления могут ссылаться на формы, содержащиеся друг в друге, согласно следующим правилам:
Если элемент управления на странице ссылается на форму в дочернем элементе управления, то URL-адрес должен включать полный уникальный идентификатор формы. Форматом является ucid:formid, где ucid — это идентификатор пользовательского элемента управления, а formid — идентификатор формы.
Если элемент управления внутри пользовательского элемента управления ссылается на форму, то ASP.NET вначале ищет ее в пользовательском элементе управления, затем в родительском элементе и так далее, до уровня страницы.
Например, предположим, что страница содержит две формы, идентификаторами которых являются FormA и FormB. Страница также содержит пользовательский элемент управления верхнего уровня с идентификатором UserControl1. Данный пользовательский элемент управления содержит две дополнительных формы, идентификаторами которых являются FormA и FormC. В следующей таблице показаны примеры возможных URL-адресов и их поведение для этой ситуации:
Расположение элемента управления |
URL-адрес формы |
Поведение |
---|---|---|
На странице |
#FormA |
Ссылается на саму форму FormA. |
На странице |
#FormC |
Выводит исключение, так как страница не содержит формы с указанным идентификатором. (Только пользовательский элемент управления содержит эту форму.) |
На странице |
#UserControl1:FormA |
Ссылается на FormA в пользовательском элементе управления. |
В пользовательском элементе управления |
#FormA |
Ссылается на FormA в пользовательском элементе управления, поскольку ASP.NET вначале ищет в самом элементе управления. |
В пользовательском элементе управления |
#FormB |
Ссылается на FormB на странице, поскольку ASP.NET определяет ссылку на форму относительно родительского элемента для элемента управления. |
Особые вопросы, связанные с созданием пользовательских элементов управления для мобильных устройств
При разработке пользовательских элементов управления для мобильных приложений необходимо принимать во внимание следующие вопросы.
Работа с предопределенными стилями
Для функциональной поддержки стилей в пользовательских элементах управления необходимо при их создании делать их производными от класса MobileUserControl в ASCX-файле, а не от стандартного класса UserControl. Следующий пример кода показывает это.
<%@ Control Language="C#"
Inherits="System.Web.UI.MobileControls.MobileUserControl"
%>
<%@ Register TagPrefix="mobile"
Namespace="System.Web.UI.MobileControls"
Assembly="System.Web.Mobile" %>
Расположение файла Web.config влияет на его использование
ASP.NET использует каталог запущенной в данный момент страницы для поиска информации конфигурации элементов управления на странице. Поэтому если в файле Web.config определены фильтры для конкретных устройств, этот файл должен располагаться в корне раздела мобильных веб-страниц веб-приложения ASP.NET. Например, если страница с именем /Reports/Report1.aspx включает в себя пользовательский элемент управления с именем /Sales/Inventory.ascx, а файл /Sales/Web.config содержит фильтры устройств, то элемент управления /Sales/Inventory.ascx будет искать определения фильтров устройств в файле /Reports/Web.config, а не в файле /Sales/Web.config.
Обработка текста литерала в пользовательских элементах управления
Текст в пользовательском элементе управления обрабатывается как элемент управления LiteralControl, а не как LiteralText. Если пользовательский элемент управления содержит текст литерала или элементы управления с внутренним разбиением на страницы, например Form, то текст появляется на всех страницах. Чтобы избежать этого, разместите содержимое пользовательского элемента управления в элементе управления Panel. Таким образом, текст будет обрабатываться структурой страниц ASP.NET и рассматриваться как элемент управления LiteralText.
См. также
Ссылки
Другие ресурсы
Создание пользовательских элементов управления для мобильных устройств