IBindableTemplate Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет способ для ASP.NET элементов управления, связанных с данными, таких как DetailsView и FormView, автоматически привязываться к ASP.NET элементам управления источниками данных внутри разделов шаблонного содержимого.
public interface class IBindableTemplate : System::Web::UI::ITemplate
public interface IBindableTemplate : System.Web.UI.ITemplate
type IBindableTemplate = interface
interface ITemplate
Public Interface IBindableTemplate
Implements ITemplate
- Производный
- Реализации
Примеры
В следующем примере кода показано, как FormView элемент управления может декларативно определять шаблонное содержимое, выполнять привязку к данным, предоставляемым элементом SqlDataSource управления, а также отображать и изменять существующие записи. Средство синтаксического анализа ASP.NET анализирует содержимое шаблона и создает IBindableTemplate объект во время выполнения, который может привязать значения из SqlDataSource элемента управления к областям привязки данных, определенным в шаблоне, как с помощью односторонного ASP.NET синтаксиса привязки данных (<%# Eval("fieldname") %>
), так и двухсторонним синтаксиса привязки данных (<%# Bind("fieldname") %>
).
Важно!
Этот элемент управления содержит текстовое поле, которое принимает введенные пользователем данные, что является потенциальной угрозой безопасности. По умолчанию данные, вводимые пользователем на веб-страницах ASP.NET, проверяются на наличие скриптов и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void EmployeeFormView_ItemUpdating(Object sender, FormViewUpdateEventArgs e)
{
// Validate the field values entered by the user. This
// example determines whether the user left any fields
// empty. Use the NewValues property to access the new
// values entered by the user.
ArrayList emptyFieldList = ValidateFields(e.NewValues);
if (emptyFieldList.Count > 0)
{
// The user left some fields empty. Display an error message.
// Use the Keys property to retrieve the key field value.
String keyValue = e.Keys["EmployeeID"].ToString();
MessageLabel.Text = "You must enter a value for each field of record " +
keyValue + ".<br/>The following fields are missing:<br/><br/>";
// Display the missing fields.
foreach (String value in emptyFieldList)
{
// Use the OldValues property to access the original value
// of a field.
MessageLabel.Text += value + " - Original Value = " +
e.OldValues[value].ToString() + "<br />";
}
// Cancel the update operation.
e.Cancel = true;
}
else
{
// The field values passed validation. Clear the
// error message label.
MessageLabel.Text = "";
}
}
ArrayList ValidateFields(IOrderedDictionary list)
{
// Create an ArrayList object to store the
// names of any empty fields.
ArrayList emptyFieldList = new ArrayList();
// Iterate though the field values entered by
// the user and check for an empty field. Empty
// fields contain a null value.
foreach (DictionaryEntry entry in list)
{
if (entry.Value == String.Empty)
{
// Add the field name to the ArrayList object.
emptyFieldList.Add(entry.Key.ToString());
}
}
return emptyFieldList;
}
void EmployeeFormView_ModeChanging(Object sender, FormViewModeEventArgs e)
{
if (e.CancelingEdit)
{
// The user canceled the update operation.
// Clear the error message label.
MessageLabel.Text = "";
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>FormView Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>FormView Example</h3>
<asp:formview id="EmployeeFormView"
datasourceid="EmployeeSource"
allowpaging="true"
datakeynames="EmployeeID"
headertext="Employee Record"
emptydatatext="No employees found."
onitemupdating="EmployeeFormView_ItemUpdating"
onmodechanging="EmployeeFormView_ModeChanging"
runat="server">
<headerstyle backcolor="CornFlowerBlue"
forecolor="White"
font-size="14"
horizontalalign="Center"
wrap="false"/>
<rowstyle backcolor="LightBlue"
wrap="false"/>
<pagerstyle backcolor="CornFlowerBlue"/>
<itemtemplate>
<table>
<tr>
<td rowspan="6">
<asp:image id="EmployeeImage"
imageurl='<%# Eval("PhotoPath") %>'
alternatetext='<%# Eval("LastName") %>'
runat="server"/>
</td>
<td colspan="2">
</td>
</tr>
<tr>
<td>
<b>Name:</b>
</td>
<td>
<%# Eval("FirstName") %> <%# Eval("LastName") %>
</td>
</tr>
<tr>
<td>
<b>Title:</b>
</td>
<td>
<%# Eval("Title") %>
</td>
</tr>
<tr>
<td>
<b>Hire Date:</b>
</td>
<td>
<%# Eval("HireDate","{0:d}") %>
</td>
</tr>
<tr style="height:150; vertical-align:top">
<td>
<b>Address:</b>
</td>
<td>
<%# Eval("Address") %><br/>
<%# Eval("City") %> <%# Eval("Region") %>
<%# Eval("PostalCode") %><br/>
<%# Eval("Country") %>
</td>
</tr>
<tr>
<td colspan="2">
<asp:linkbutton id="Edit"
text="Edit"
commandname="Edit"
runat="server"/>
</td>
</tr>
</table>
</itemtemplate>
<edititemtemplate>
<table>
<tr>
<td rowspan="6">
<asp:image id="EmployeeEditImage"
imageurl='<%# Eval("PhotoPath") %>'
alternatetext='<%# Eval("LastName") %>'
runat="server"/>
</td>
<td colspan="2">
</td>
</tr>
<tr>
<td>
<b>Name:</b>
</td>
<td>
<asp:textbox id="FirstNameUpdateTextBox"
text='<%# Bind("FirstName") %>'
runat="server"/>
<asp:textbox id="LastNameUpdateTextBox"
text='<%# Bind("LastName") %>'
runat="server"/>
</td>
</tr>
<tr>
<td>
<b>Title:</b>
</td>
<td>
<asp:textbox id="TitleUpdateTextBox"
text='<%# Bind("Title") %>'
runat="server"/>
</td>
</tr>
<tr>
<td>
<b>Hire Date:</b>
</td>
<td>
<asp:textbox id="HireDateUpdateTextBox"
text='<%# Bind("HireDate", "{0:d}") %>'
runat="server"/>
</td>
</tr>
<tr style="height:150; vertical-align:top">
<td>
<b>Address:</b>
</td>
<td>
<asp:textbox id="AddressUpdateTextBox"
text='<%# Bind("Address") %>'
runat="server"/>
<br/>
<asp:textbox id="CityUpdateTextBox"
text='<%# Bind("City") %>'
runat="server"/>
<asp:textbox id="RegionUpdateTextBox"
text='<%# Bind("Region") %>'
width="40"
runat="server"/>
<asp:textbox id="PostalCodeUpdateTextBox"
text='<%# Bind("PostalCode") %>'
width="60"
runat="server"/>
<br/>
<asp:textbox id="CountryUpdateTextBox"
text='<%# Bind("Country") %>'
runat="server"/>
</td>
</tr>
<tr>
<td colspan="2">
<asp:linkbutton id="UpdateButton"
text="Update"
commandname="Update"
runat="server"/>
<asp:linkbutton id="CancelButton"
text="Cancel"
commandname="Cancel"
runat="server"/>
</td>
</tr>
</table>
</edititemtemplate>
<pagersettings position="Bottom"
mode="Numeric"/>
</asp:formview>
<br/><br/>
<asp:label id="MessageLabel"
forecolor="Red"
runat="server"/>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the Northwind sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:sqldatasource id="EmployeeSource"
selectcommand="Select [EmployeeID], [LastName], [FirstName], [Title], [Address], [City], [Region], [PostalCode], [Country], [HireDate], [PhotoPath] From [Employees]"
updatecommand="Update [Employees] Set [LastName]=@LastName, [FirstName]=@FirstName, [Title]=@Title, [Address]=@Address, [City]=@City, [Region]=@Region, [PostalCode]=@PostalCode, [Country]=@Country Where [EmployeeID]=@EmployeeID"
connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"
runat="server"/>
</form>
</body>
</html>
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Sub EmployeeFormView_ItemUpdating(ByVal sender As Object, ByVal e As FormViewUpdateEventArgs) Handles EmployeeFormView.ItemUpdating
' Validate the field values entered by the user. This
' example determines whether the user left any fields
' empty. Use the NewValues property to access the new
' values entered by the user.
Dim emptyFieldList As ArrayList = ValidateFields(e.NewValues)
If emptyFieldList.Count > 0 Then
' The user left some fields empty. Display an error message.
' Use the Keys property to retrieve the key field value.
Dim keyValue As String = e.Keys("EmployeeID").ToString()
MessageLabel.Text = "You must enter a value for each field of record " & _
keyValue & ".<br/>The following fields are missing:<br/><br/>"
' Display the missing fields.
Dim value As String
For Each value In emptyFieldList
' Use the OldValues property to access the original value
' of a field.
MessageLabel.Text &= value & " - Original Value = " & _
e.OldValues(value).ToString() & "<br />"
Next
' Cancel the update operation.
e.Cancel = True
Else
' The field values passed validation. Clear the
' error message label.
MessageLabel.Text = ""
End If
End Sub
Function ValidateFields(ByVal list As IOrderedDictionary) As ArrayList
' Create an ArrayList object to store the
' names of any empty fields.
Dim emptyFieldList As New ArrayList()
' Iterate though the field values entered by
' the user and check for an empty field. Empty
' fields contain a null value.
Dim entry As DictionaryEntry
For Each entry In list
If entry.Value Is String.Empty Then
' Add the field name to the ArrayList object.
emptyFieldList.Add(entry.Key.ToString())
End If
Next
Return emptyFieldList
End Function
Sub EmployeeFormView_ModeChanging(ByVal sender As Object, ByVal e As FormViewModeEventArgs) Handles EmployeeFormView.ModeChanging
If e.CancelingEdit Then
' The user canceled the update operation.
' Clear the error message label.
MessageLabel.Text = ""
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>FormView Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>FormView Example</h3>
<asp:formview id="EmployeeFormView"
datasourceid="EmployeeSource"
allowpaging="true"
datakeynames="EmployeeID"
headertext="Employee Record"
emptydatatext="No employees found."
runat="server">
<headerstyle backcolor="CornFlowerBlue"
forecolor="White"
font-size="14"
horizontalalign="Center"
wrap="false"/>
<rowstyle backcolor="LightBlue"
wrap="false"/>
<pagerstyle backcolor="CornFlowerBlue"/>
<itemtemplate>
<table>
<tr>
<td rowspan="6">
<asp:image id="EmployeeImage"
imageurl='<%# Eval("PhotoPath") %>'
alternatetext='<%# Eval("LastName") %>'
runat="server"/>
</td>
<td colspan="2">
</td>
</tr>
<tr>
<td>
<b>Name:</b>
</td>
<td>
<%# Eval("FirstName") %> <%# Eval("LastName") %>
</td>
</tr>
<tr>
<td>
<b>Title:</b>
</td>
<td>
<%# Eval("Title") %>
</td>
</tr>
<tr>
<td>
<b>Hire Date:</b>
</td>
<td>
<%# Eval("HireDate","{0:d}") %>
</td>
</tr>
<tr style="height:150; vertical-align:top">
<td>
<b>Address:</b>
</td>
<td>
<%# Eval("Address") %><br/>
<%# Eval("City") %> <%# Eval("Region") %>
<%# Eval("PostalCode") %><br/>
<%# Eval("Country") %>
</td>
</tr>
<tr>
<td colspan="2">
<asp:linkbutton id="Edit"
text="Edit"
commandname="Edit"
runat="server"/>
</td>
</tr>
</table>
</itemtemplate>
<edititemtemplate>
<table>
<tr>
<td rowspan="6">
<asp:image id="EmployeeEditImage"
imageurl='<%# Eval("PhotoPath") %>'
alternatetext='<%# Eval("LastName") %>'
runat="server"/>
</td>
<td colspan="2">
</td>
</tr>
<tr>
<td>
<b>Name:</b>
</td>
<td>
<asp:textbox id="FirstNameUpdateTextBox"
text='<%# Bind("FirstName") %>'
runat="server"/>
<asp:textbox id="LastNameUpdateTextBox"
text='<%# Bind("LastName") %>'
runat="server"/>
</td>
</tr>
<tr>
<td>
<b>Title:</b>
</td>
<td>
<asp:textbox id="TitleUpdateTextBox"
text='<%# Bind("Title") %>'
runat="server"/>
</td>
</tr>
<tr>
<td>
<b>Hire Date:</b>
</td>
<td>
<asp:textbox id="HireDateUpdateTextBox"
text='<%# Bind("HireDate", "{0:d}") %>'
runat="server"/>
</td>
</tr>
<tr style="height:150; vertical-align:top">
<td>
<b>Address:</b>
</td>
<td>
<asp:textbox id="AddressUpdateTextBox"
text='<%# Bind("Address") %>'
runat="server"/>
<br/>
<asp:textbox id="CityUpdateTextBox"
text='<%# Bind("City") %>'
runat="server"/>
<asp:textbox id="RegionUpdateTextBox"
text='<%# Bind("Region") %>'
width="40"
runat="server"/>
<asp:textbox id="PostalCodeUpdateTextBox"
text='<%# Bind("PostalCode") %>'
width="60"
runat="server"/>
<br/>
<asp:textbox id="CountryUpdateTextBox"
text='<%# Bind("Country") %>'
runat="server"/>
</td>
</tr>
<tr>
<td colspan="2">
<asp:linkbutton id="UpdateButton"
text="Update"
commandname="Update"
runat="server"/>
<asp:linkbutton id="CancelButton"
text="Cancel"
commandname="Cancel"
runat="server"/>
</td>
</tr>
</table>
</edititemtemplate>
<pagersettings position="Bottom"
mode="Numeric"/>
</asp:formview>
<br/><br/>
<asp:label id="MessageLabel"
forecolor="Red"
runat="server"/>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the Northwind sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:sqldatasource id="EmployeeSource"
selectcommand="Select [EmployeeID], [LastName], [FirstName], [Title], [Address], [City], [Region], [PostalCode], [Country], [HireDate], [PhotoPath] From [Employees]"
updatecommand="Update [Employees] Set [LastName]=@LastName, [FirstName]=@FirstName, [Title]=@Title, [Address]=@Address, [City]=@City, [Region]=@Region, [PostalCode]=@PostalCode, [Country]=@Country Where [EmployeeID]=@EmployeeID"
connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"
runat="server"/>
</form>
</body>
</html>
Комментарии
Интерфейс IBindableTemplate предоставляет способ ASP.NET элементов управления с привязкой к данным, таких как DetailsView, GridViewи FormView, для привязки к данным, предоставляемым ASP.NET элементом управления источником данных, например ObjectDataSource или SqlDataSource, если элемент управления с привязкой к данным содержит шаблонное содержимое.
Примечание
Разработчики страниц не реализуют IBindableTemplate интерфейс . Разработчики, создающие пользовательские элементы управления с привязкой к данным, могут управлять IBindableTemplate объектами в реализациях PerformDataBinding методов и ExtractRowValues , но не реализовывать собственные IBindableTemplate объекты.
Элементы управления с привязкой к данным, такие как GridView , обычно знают о своих дочерних деревьях элементов управления и поэтому могут привязывать к ним значения, извлекать из них значения и передавать эти значения между элементом управления с привязкой к данным и элементом управления источником данных при каждом связывании данных. Однако когда разработчик страницы определяет шаблонное содержимое для элемента управления с привязкой к данным, дочерние элементы управления в шаблоне не видны родительскому элементу управления с привязкой к данным: родительский элемент управления может отображать дочернее содержимое (так как элементы управления фактически отрисовываются сами), но он не может извлечь значения этих дочерних элементов управления для передачи в обновление связанного элемента управления источником данных. Операция вставки или удаления. В сценариях привязки данных шаблонное содержимое непрозрачно для родительского элемента управления с привязкой к данным. Синтаксис Bind
позволяет элементу управления с привязкой к данным извлекать значения из элемента управления, привязанного к данным внутри экземпляра IBindableTemplate .
Привязка данных может быть односторонняя или двусторонняя. (Эти направления привязки определяются перечислением BindingDirection .) Односторонняя привязка данных — это любая привязка данных, выполняемая в исходящем направлении, от элемента управления источником данных до элемента управления с привязкой к данным; Например, любой сценарий чтения данных предполагает односторонние привязки данных. Для односторонними привязки данных можно использовать синтаксис односторонняя привязка данных (<%# Eval("fieldname") %>
) внутри содержимого шаблона и не требуется использовать двухсторонняя ASP.NET синтаксис привязки данных. Двусторонняя привязка данных описывает привязку данных в направлении входящего трафика, от элемента управления с привязкой к данным к элементу управления источником данных. Сценарии автоматического редактирования, вставки и удаления с помощью ASP.NET привязанных к данным и источников данных являются сценариями двусторонней привязки данных. В этих сценариях используются выражения двусторонней привязки данных (<%# Bind("fieldname") %>
). Интерфейс IBindableTemplate и инфраструктура ASP.NET поддерживают автоматическую декларативную двусторонняя привязку данных между ASP.NET элементами управления источником данных и шаблонным содержимым. Дополнительные сведения о ASP.NET выражениях привязки данных и синтаксисе см. в разделах Привязка к базам данных и Общие сведения о выражениях привязки данных.
Шаблонное содержимое для элементов управления с привязкой к данным чаще всего определяется декларативно. В следующей таблице описаны процессы, которые чаще всего используются для привязки шаблонных данных к элементам управления с привязкой к данным.
Элемент управления с привязкой к данным | Как это работает |
---|---|
DetailsView | Элемент управления с привязкой к данным привязывается к данным с помощью DataSourceID свойства элемента управления источником данных, а содержимое шаблона определяется в свойстве ItemTemplate, EditItemTemplate или InsertItemTemplate . |
GridView | Элемент управления с привязкой к данным привязывается к данным с помощью DataSourceID свойства элемента управления источником данных, а содержимое шаблона определяется в свойстве ItemTemplate или EditItemTemplate . Элемент GridView управления не поддерживает операцию вставки. |
FormView | Элемент управления с привязкой к данным привязывается к данным с помощью DataSourceID свойства , а содержимое шаблона определяется в свойстве ItemTemplate, InsertItemTemplateили EditItemTemplate в объекте TemplateField . |
Элементы DataList управления и Repeater не поддерживают автоматические сценарии двусторонней привязки данных.
ASP.NET неявно создает IBindableTemplate объект при анализе содержимого шаблона, которое привязывается к ASP.NET элементу управления источником данных в шаблоне. В частности, средство синтаксического анализа ASP.NET создает экземпляр CompiledBindableTemplateBuilder класса при анализе шаблонного содержимого, использующего синтаксис привязки данных ASP.NET и содержащего ASP.NET серверных веб-элементов управления, поддерживающих привязку данных. Эти элементы управления ASP.NET помечаются атрибутом BindableAttribute .
Интерфейс IBindableTemplate определяет один метод , ExtractValues. Этот метод определяется для двусторонней привязки данных, чтобы элемент управления с привязкой к данным может автоматически извлекать пары "имя-значение" из шаблонного содержимого и передавать эти пары в элемент управления источником данных во время выполнения. Для успешной автоматической привязки данных имена полей, извлеченные из шаблонного содержимого методом , должны совпадать с именами ExtractValues параметров в связанном элементе управления источником данных. Разработчики элементов управления явно вызывают ExtractValues метод только в своих реализациях ExtractRowValues или другом аналогичном методе пользовательского элемента управления с привязкой к данным.
Методы
ExtractValues(Control) |
При реализации классом извлекает внутри шаблонного содержимого набор пар "имя-значение" для значений, связанных с помощью синтаксиса двухсторонней привязки ASP.NET. |
InstantiateIn(Control) |
При реализации каким-либо классом определяет объект Control, которому принадлежат дочерние элементы управления и шаблоны. В свою очередь, эти дочерние элементы управления определяются в пределах встроенного шаблона. (Унаследовано от ITemplate) |