IWebPart Interface
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Defines common user interface (UI) properties used by ASP.NET WebPart controls.
public interface class IWebPart
public interface IWebPart
type IWebPart = interface
Public Interface IWebPart
- Derived
Examples
The following code example demonstrates how to implement the IWebPart interface in a user control. This is a simple implementation that shows minimally how to implement the properties.
The first part of the code example shows the user control. The user control implements all the properties of the IWebPart interface, plus two additional public properties tied to controls in the user interface. The two custom properties each use the Personalizable
attribute, which enables the values in those properties to be saved across browser sessions. Note that in the base WebPart class implementation, all the properties of the IWebPart interface are implemented as personalizable as well, though they are not in this code example.
<%@ control language="C#" classname="AccountUserControlCS"%>
<%@ implements interface="System.Web.UI.WebControls.WebParts.IWebPart" %>
<script runat="server">
private string m_Description;
private string m_Title;
private string m_TitleIconImageUrl;
private string m_TitleUrl;
private string m_CatalogIconImageUrl;
[Personalizable]
public string UserName
{
get
{
if(String.IsNullOrEmpty(Textbox1.Text))
return String.Empty;
else
return Textbox1.Text;
}
set
{
Textbox1.Text = value;
}
}
[Personalizable]
public string Phone
{
get
{
if(String.IsNullOrEmpty(Textbox2.Text))
return String.Empty;
else
return Textbox2.Text;
}
set
{
Textbox2.Text = value;
}
}
// <snippet3>
public string Description
{
get
{
object objTitle = ViewState["Description"];
if (objTitle == null)
return String.Empty;
return (string)objTitle;
}
set
{
ViewState["Description"] = value;
}
}
// </snippet3>
// <snippet4>
public string Title
{
get
{
object objTitle = ViewState["Title"];
if (objTitle == null)
return String.Empty;
return (string)objTitle;
}
set
{
ViewState["Title"] = value;
}
}
// </snippet4>
// <snippet5>
public string Subtitle
{
get
{
object objSubTitle = ViewState["Subtitle"];
if (objSubTitle == null)
return "My Subtitle";
return (string)objSubTitle;
}
}
// </snippet5>
// <snippet6>
public string TitleIconImageUrl
{
get
{
object objTitle = ViewState["TitleIconImageUrl"];
if (objTitle == null)
return String.Empty;
return (string)objTitle;
}
set
{
ViewState["TitleIconImageUrl"] = value;
}
}
// </snippet6>
// <snippet7>
public string TitleUrl
{
get
{
object objTitle = ViewState["TitleUrl"];
if (objTitle == null)
return String.Empty;
return (string)objTitle;
}
set
{
ViewState["TitleUrl"] = value;
}
}
// </snippet7>
// <snippet8>
public string CatalogIconImageUrl
{
get
{
object objTitle = ViewState["CatalogIconImageUrl"];
if (objTitle == null)
return String.Empty;
return (string)objTitle;
}
set
{
ViewState["CatalogIconImageUrl"] = value;
}
}
// </snippet8>
// <snippet9>
// Update the selected IWebPart property value.
void Button1_Click(object sender, EventArgs e)
{
String propertyValue = Server.HtmlEncode(TextBox3.Text);
TextBox3.Text = String.Empty;
switch (RadioButtonList1.SelectedValue)
{
case "title":
this.Title = propertyValue;
break;
case "description":
this.Description = propertyValue;
break;
case "catalogiconimageurl":
this.CatalogIconImageUrl = propertyValue;
break;
case "titleiconimageurl":
this.TitleIconImageUrl = propertyValue;
break;
case "titleurl":
this.TitleUrl = propertyValue;
break;
default:
break;
}
}
// </snippet9>
</script>
<div>
<asp:label id="Label1" runat="server" AssociatedControlID="Textbox1">
Name</asp:label>
<asp:textbox id="Textbox1" runat="server" />
</div>
<div>
<asp:label id="Label2" runat="server" AssociatedControlID="Textbox2">
Phone</asp:label>
<asp:textbox id="Textbox2" runat="server"></asp:textbox>
</div>
<div>
<asp:button id="Button2" runat="server" text="Save Form Values" />
</div>
<hr />
<asp:Label ID="Label3" Runat="server" Text="Label"
AssociatedControlID="RadioButtonList1">
<h3>Update selected IWebPart property values.</h3>
</asp:Label>
<asp:RadioButtonList ID="RadioButtonList1" Runat="server">
<asp:ListItem Value="title">Title</asp:ListItem>
<asp:ListItem Value="description">Description</asp:ListItem>
<asp:ListItem Value="catalogiconimageurl">CatalogIconImageUrl</asp:ListItem>
<asp:ListItem Value="titleiconimageurl">TitleIconImageUrl</asp:ListItem>
<asp:ListItem Value="titleurl">TitleUrl</asp:ListItem>
</asp:RadioButtonList>
<br />
<asp:Label ID="Label4" runat="server" Text="Label"
AssociatedControlID="TextBox3">
Property Value:
</asp:Label>
<asp:TextBox ID="TextBox3" runat="server">
</asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server"
Text="Update Property"
OnClick="Button1_Click">
</asp:Button>
<%@ control language="VB" classname="AccountUserControlVB"%>
<%@ implements interface="System.Web.UI.WebControls.WebParts.IWebPart" %>
<script runat="server">
Private m_Description As String
Private m_Title As String
Private m_TitleIconImageUrl As String
Private m_TitleUrl As String
Private m_CatalogIconImageUrl As String
<Personalizable()> _
Public Property UserName() As String
Get
If String.IsNullOrEmpty(Textbox1.Text) Then
Return String.Empty
Else
Return Textbox1.Text
End If
End Get
Set(ByVal value As String)
Textbox1.Text = Value
End Set
End Property
<Personalizable()> _
Public Property Phone() As String
Get
If String.IsNullOrEmpty(Textbox2.Text) Then
Return String.Empty
Else
Return Textbox2.Text
End If
End Get
Set(ByVal value As String)
Textbox2.Text = Value
End Set
End Property
' <snippet3>
Public Property Description() As String _
Implements IWebPart.Description
Get
Dim objTitle As Object = ViewState("Description")
If objTitle Is Nothing Then
Return String.Empty
End If
Return CStr(objTitle)
End Get
Set(ByVal value As String)
ViewState("Description") = value
End Set
End Property
' </snippet3>
' <snippet4>
Public Property Title() As String _
Implements IWebPart.Title
Get
Dim objTitle As Object = ViewState("Title")
If objTitle Is Nothing Then
Return String.Empty
End If
Return CStr(objTitle)
End Get
Set(ByVal value As String)
ViewState("Title") = value
End Set
End Property
' </snippet4>
' <snippet5>
ReadOnly Property Subtitle() As String _
Implements IWebPart.Subtitle
Get
Dim objSubTitle As Object = ViewState("Subtitle")
If objSubTitle Is Nothing Then
Return "My Subtitle"
End If
Return CStr(objSubTitle)
End Get
End Property
' </snippet5>
' <snippet6>
Public Property TitleIconImageUrl() As String _
Implements IWebPart.TitleIconImageUrl
Get
Dim objTitle As Object = ViewState("TitleIconImageUrl")
If objTitle Is Nothing Then
Return String.Empty
End If
Return CStr(objTitle)
End Get
Set(ByVal value As String)
ViewState("TitleIconImageUrl") = value
End Set
End Property
' </snippet6>
' <snippet7>
Public Property TitleUrl() As String _
Implements IWebPart.TitleUrl
Get
Dim objTitle As Object = ViewState("TitleUrl")
If objTitle Is Nothing Then
Return String.Empty
End If
Return CStr(objTitle)
End Get
Set(ByVal value As String)
ViewState("TitleUrl") = value
End Set
End Property
' </snippet7>
' <snippet8>
Public Property CatalogIconImageUrl() As String _
Implements IWebPart.CatalogIconImageUrl
Get
Dim objTitle As Object = ViewState("CatalogIconImageUrl")
If objTitle Is Nothing Then
Return String.Empty
End If
Return CStr(objTitle)
End Get
Set(ByVal value As String)
ViewState("CatalogIconImageUrl") = value
End Set
End Property
' </snippet8>
' <snippet9>
' Update the selected IWebPart property value.
Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim propertyValue As String = Server.HtmlEncode(TextBox3.Text)
TextBox3.Text = String.Empty
Select Case RadioButtonList1.SelectedValue
Case "title"
Me.Title = propertyValue
Case "description"
Me.Description = propertyValue
Case "catalogiconimageurl"
Me.CatalogIconImageUrl = propertyValue
Case "titleiconimageurl"
Me.TitleIconImageUrl = propertyValue
Case "titleurl"
Me.TitleUrl = propertyValue
Case Else
End Select
End Sub 'Button1_Click
' </snippet9>
</script>
<div>
<asp:label id="Label1" runat="server" AssociatedControlID="Textbox1">
Name</asp:label>
<asp:textbox id="Textbox1" runat="server" />
</div>
<div>
<asp:label id="Label2" runat="server" AssociatedControlID="Textbox2">
Phone</asp:label>
<asp:textbox id="Textbox2" runat="server"></asp:textbox>
</div>
<div>
<asp:button id="Button2" runat="server" text="Save Form Values" />
</div>
<hr />
<asp:Label ID="Label3" Runat="server" AssociatedControlID="RadioButtonList1">
<h3>Update selected IWebPart property values.</h3>
</asp:Label>
<asp:RadioButtonList ID="RadioButtonList1" Runat="server">
<asp:ListItem Value="title">Title</asp:ListItem>
<asp:ListItem Value="description">Description</asp:ListItem>
<asp:ListItem Value="catalogiconimageurl">CatalogIconImageUrl</asp:ListItem>
<asp:ListItem Value="titleiconimageurl">TitleIconImageUrl</asp:ListItem>
<asp:ListItem Value="titleurl">TitleUrl</asp:ListItem>
</asp:RadioButtonList>
<br />
<asp:Label ID="Label4" runat="server" AssociatedControlID="TextBox3">
Property Value:
</asp:Label>
<asp:TextBox ID="TextBox3" runat="server">
</asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server"
Text="Update Property"
OnClick="Button1_Click">
</asp:Button>
The second part of the code example shows the Web page that hosts the user control. The page has a WebPartZone control, within which the user control is referenced. Notice that several of the IWebPart interface's property values are set declaratively in the markup for the user control, which enables it to both behave and appear similar to a WebPart control at design time and run time. If you load the page in a browser, you can use the UI on the page to demonstrate the ability to programmatically change the values of the implemented IWebPart properties at run time. When you change some of the property values, the changes are not evident on the page, but are visible in the page source (the TitleIconImageUrl property), or are stored in the application's state data (the CatalogIconImageUrl property).
Important
This example has a text box that accepts user input, which is a potential security threat. By default, ASP.NET Web pages validate that user input does not include script or HTML elements. For more information, see Script Exploits Overview.
<%@ page language="c#" %>
<%@ register tagprefix="uc1"
tagname="AccountUserControlCS"
src="AccountUserControlcs.ascx"%>
<!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>
Personalizable User Control with IWebPart Properties
</title>
</head>
<body>
<form id="form1" runat="server">
<asp:webpartmanager id="WebPartManager1" runat="server" />
<asp:webpartzone
id="zone1"
runat="server"
headertext="Main"
CloseVerb-Enabled="false">
<zonetemplate>
<uc1:AccountUserControlCS
runat="server"
id="accountwebpart"
title="Account Form"
Description="Account Form with default values."
CatalogIconImageUrl="MyCatalogIcon.gif"
TitleIconImageUrl="MyTitleIcon.gif"
TitleUrl="MyUrl.html"/>
</zonetemplate>
</asp:webpartzone>
</form>
</body>
</html>
<%@ page language="VB" %>
<%@ register tagprefix="uc1"
tagname="AccountUserControlVB"
src="AccountUserControlvb.ascx"%>
<!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>
Personalizable User Control with IWebPart Properties
</title>
</head>
<body>
<form id="form1" runat="server">
<asp:webpartmanager id="WebPartManager1" runat="server" />
<asp:webpartzone
id="zone1"
runat="server"
headertext="Main"
CloseVerb-Enabled="false">
<zonetemplate>
<uc1:AccountUserControlVB
runat="server"
id="accountwebpart"
title="Account Form"
Description="Account Form with default values."
CatalogIconImageUrl="MyCatalogIcon.gif"
TitleIconImageUrl="MyTitleIcon.gif"
TitleUrl="MyUrl.html"/>
</zonetemplate>
</asp:webpartzone>
</form>
</body>
</html>
Remarks
The IWebPart interface provides several UI-oriented properties that enhance the user experience of working with WebPart controls. When you create controls that derive from the base WebPart class, you get an implementation of all the properties in the IWebPart interface, because the WebPart base class implements this interface.
You can use existing user controls, ASP.NET controls, or custom server controls that do not inherit from the WebPart class as part of a Web Parts application, and they can also use these UI-oriented properties declared by the IWebPart interface. If you place existing server controls in a WebPartZoneBase zone, at run time they are wrapped with a GenericWebPart object. Because the GenericWebPart class inherits from the WebPart base class, it enables existing server controls to act as true WebPart controls and it adds to them the properties of the IWebPart interface.
If you place server controls that are not WebPart controls in zones, they can use the IWebPart properties at run time, and you can also declare values for those properties on server controls in the markup of the page (in page persistence format). However, because these properties are only available to the server controls at run time, design-time coding features such as IntelliSense do not recognize IWebPart properties that are declared on server controls. Declared properties on these controls still work when you load the page, but Microsoft Visual Studio does not recognize the properties as valid at design time. If you want to add the IWebPart properties to existing server and user controls to enhance the design-time user experience, you can implement the IWebPart interface in a server control.
Perhaps the main reason to implement the IWebPart interface is for controls that do not support the use of expando (custom) properties. Expando properties are strings that can be added to a class dynamically as a property, by means of the IAttributeAccessor interface. Controls that implement this interface, including the WebControl class and its children, can use expando properties. Therefore, all ASP.NET server controls, custom controls that derive from them, Web user controls, and WebPart controls support the use of expando properties. But custom controls that inherit directly from the base Control class do not support expando properties. Thus, if you declare these controls within a WebPartZone, you will not be able to declare the common IWebPart properties on the controls, properties such as Title and Description. If you want to use these properties with such controls, you must implement the IWebPart interface.
Notes to Implementers
Normally you do not need to implement the IWebPart interface, either on custom WebPart controls or server controls, because the base WebPart class already implements the interface. Custom WebPart controls, and other server controls that are placed in WebPartZoneBase zones, can use all the IWebPart properties.
The main reason to implement the IWebPart interface yourself, whether in a custom WebPart control or another server control, is if you want to change the default implementation. For example, you might want to provide default values for some of the properties. Another reason to implement the interface in a user or server control is so that the design-time experience of working with these properties on the control will be enhanced.
Properties
CatalogIconImageUrl |
Gets or sets the URL to an image that represents a WebPart control in a catalog of controls. |
Description |
Gets or sets a brief phrase that summarizes what a control does, for use in ToolTips and catalogs of WebPart controls. |
Subtitle |
Gets a string that is concatenated with the Title property value to form a complete title for a WebPart control. |
Title |
Gets or sets the title of a WebPart control. |
TitleIconImageUrl |
Gets or sets the URL to an image used to represent a Web Parts control in the control's own title bar. |
TitleUrl |
Gets or sets a URL to supplemental information about a WebPart control. |