Практическое руководство. Использование пользовательских серверных элементов управления ASP.NET в Visual Studio
Обновлен: Ноябрь 2007
Пользовательские серверные элементы управления становятся доступными в панели элементов Visual Studio путем задания соответствующих атрибутов времени разработки, которые позволяют использовать эти элементы управления в визуальном конструкторе. Следующие процедуры создают простой элемент управления с именем MailLink, добавляют его в панель элементов и используют его для создания ссылки электронной почты на веб-странице путем представления элемента гиперссылки <a> в виде URL mailto:.
Создание пользовательского элемента управления, содержащего атрибуты времени разработки
В Visual Studio создайте проект библиотеки и определите пользовательский класс, производный от WebControl, как показано в следующем примере.
Примечание. Полный текст примера приведен в подразделе "Пример".
<Assembly: TagPrefix("Samples.AspNet", "Sample")> Namespace Samples.AspNet < _ ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=""server""> </{0}:MailLink>")> _ Public Class MailLink Inherits WebControl ' Custom code goes here. End Class End Namespace
[assembly:TagPrefix("Samples.AspNet", "Sample")] namespace Samples.AspNet { [ ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=\"server\"> </{0}:MailLink>") ] public class MailLink : WebControl { // Custom code goes here. } }
Добавьте атрибуты времени разработки для предоставления пользовательских метаданных, которые будут использоваться для отображения элемента управления в визуальном конструкторе во время разработки. Следующие два атрибута режима проектирования являются единственными, необходимыми для того, чтобы элементы управления MailLink стали доступны в панели элементов Visual Studio.
Атрибут TagPrefix задает префикс в начале имени элемента управления MailLink. Совместно префикс и имя элемента управления определяют имя тега для пользовательского элемента управления (в данном случае — <Sample:MailLink> </Sample:MailLink>).
<Assembly: TagPrefix("Samples.AspNet", "Sample")>
[assembly:TagPrefix("Samples.AspNet", "Sample")]
Атрибут ToolboxData задает тег по умолчанию, который создается для элемента управления MailLink при его перетаскивании из панели элементов на страницу в режиме разработки.
<ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat='server'"> </{0}:MailLink>")>
[ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat=\"server\"> </{0}:MailLink>")]
Скомпилируйте элемент управления MailLink в библиотеку и назовите ее MaiLink.Dll.
Добавление пользовательского элемента управления в панель элементов
В меню Вид выберите пункт Панель элементов.
В панели элементов щелкните правой кнопкой мыши и выберите команду Выбрать элементы.
В диалоговом окне Выбор элементов панели элементов перейдите на вкладку Компоненты .NET Framework и нажмите кнопку Обзор, чтобы найти только что построенную библиотеку MailLink.Dll.
Установите флажок для элемента управления MailLink и нажмите кнопку OK.
Пользовательский элемент управления MailLink появится в панели элементов.
Обращение к элементу управления MailLink на странице
Создайте новый веб-проект. Затем создайте страницу с именем MailLink.aspx. Эта страница будет содержать одну из следующих директив, в зависимости от выбранного для проекта языка:
<%@ page language="VB" %>
<%@ page language="C#" %>
Добавьте следующий HTML-код, представляющий структуру основной страницы для размещения элемента управления MailLink.
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Using the MailLink control</title> </head> <body> <h1>Using the MailLink Custom Server Control</h1> <form id="form1" runat="server"> <div> </div> </form> </body> </html>
Переключитесь в режим разработки и перетащите элемент управления MailLink на страницу.
Visual Studio добавит два элемента на страницу: директиву Register для элемента управления MailLink и имя тега элемента управления MailLink для использования на странице.
Запустите страницу в обозревателе и щелкните ссылку Mail Webmaster (написать веб-мастеру).
Откроется почтовое сообщение, адрес назначения которого указан свойством Email элемента управления.
Пример
Элемент управления MailLink переопределяет свойство TagKey для отрисовки элемента <a> вместо элемента по умолчанию <span>, представляемого классом WebControl.
Imports System
Imports System.ComponentModel
Imports System.Security
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
<Assembly: TagPrefix("Samples.AspNet", "Sample")>
Namespace Samples.AspNet
<AspNetHostingPermission( _
SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
AspNetHostingPermission( _
SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
ParseChildren(True, "Text"), _
DefaultProperty("Email"), _
ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Web Master' runat=""server""> </{0}:MailLink>")> _
Public Class MailLink
Inherits WebControl
<Browsable(True), Category("Appearance"), _
DefaultValue("webmaster@contoso.com"), _
Description("The e-mail address.")> _
Public Overridable Property Email() As String
Get
Dim s As String = CStr(ViewState("Email"))
If s Is Nothing Then s = "webmaster@contoso.com"
Return s
End Get
Set(ByVal value As String)
ViewState("Email") = value
End Set
End Property
<Browsable(True), Category("Appearance"), _
DefaultValue("Web Master"), _
Description("The name to display."), _
Localizable(True), _
PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
Public Overridable Property [Text]() As String
Get
Dim s As String = CStr(ViewState("Text"))
If s Is Nothing Then s = String.Empty
Return s
End Get
Set(ByVal value As String)
ViewState("Text") = value
End Set
End Property
Protected Overrides ReadOnly Property TagKey() _
As HtmlTextWriterTag
Get
Return HtmlTextWriterTag.A
End Get
End Property
Protected Overrides Sub AddAttributesToRender(ByVal writer _
As HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
writer.AddAttribute( _
HtmlTextWriterAttribute.Href, "mailto:" + Email)
End Sub 'AddAttributesToRender
Protected Overrides Sub RenderContents(ByVal writer _
As HtmlTextWriter)
If [Text] = String.Empty Then
[Text] = Email
End If
writer.WriteEncodedText([Text])
End Sub 'RenderContents
End Class 'MailLink
End Namespace
using System;
using System.ComponentModel;
using System.Security;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[assembly:TagPrefix("Samples.AspNet", "Sample")]
namespace Samples.AspNet
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
ParseChildren(true, "Text"),
DefaultProperty("Email"),
ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Web Master' runat=\"server\"> </{0}:MailLink>")
]
public class MailLink : WebControl
{
[
Browsable(true),
Category("Appearance"),
DefaultValue("webmaster@contoso.com"),
Description("The e-mail address.")
]
public virtual string Email
{
get
{
string s = (string)ViewState["Email"];
return (s == null) ? "webmaster@contoso.com" : s;
}
set
{
ViewState["Email"] = value;
}
}
[
Browsable(true),
Category("Appearance"),
DefaultValue("Web Master"),
Description("The name to display."),
Localizable(true),
PersistenceMode(PersistenceMode.InnerDefaultProperty)
]
public virtual string Text
{
get
{
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["Text"] = value;
}
}
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.A;
}
}
protected override void AddAttributesToRender(
HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,
"mailto:" + Email);
}
protected override void RenderContents(HtmlTextWriter writer)
{
if (Text == String.Empty)
{
Text = Email;
}
writer.WriteEncodedText(Text);
}
}
}
Элемент управления MailLink также демонстрирует персистентность внутреннего текста. MailLink позволяет разработчику страницы указывать свойство Text в тегах элемента управления, как показано в следующем примере:
<Sample:MailLink id="MaillinkID" Email="Webmaster@contoso.com"
runat="server">
Mail Support Team
</Sample:MailLink>
Внутренняя персистентность отличается от персистентности по умолчанию, используемой в открывающем теге элемента управления, как в следующем примере:
<Sample:MailLink Text="Mail Webmaster" runat="server" > </Sample:MailLink>
Приведенный выше код представляет тег по умолчанию, созданный для элемента управления при его перетаскивании из панели элементов на страницу.
Компиляция кода
В Visual Studio создайте проект библиотеки и определите пользовательский класс, производный от WebControl, как показано в приведенной выше процедуре. Полный исходный код приведен в предыдущем разделе.
Безопасность
Пользовательские серверные элементы управления расширяют функциональные возможности ASP.NET и должны соответствовать определенным рекомендациям по обеспечению безопасности. В частности, необходимо учитывать следующее:
Безопасность времени выполнения и времени разработки.
Пользовательские элементы управления в сборках со строгими именами.
Безопасность операционной системы и списков управления доступом (ACL) на том сервере, на котором выполняется пользовательский серверный элемент управления.
Управление доступом для кода для ограничения ресурсов, доступных элементу управления.
Управляемые сборки в глобальном кэше сборок.
См. также
Основные понятия
Атрибуты времени разработки для компонентов
Атрибуты и поддержка во время разработки
Пользовательские серверные элементы управления безопасностью
Другие ресурсы
Разработка пользовательских серверных элементов управления ASP.NET