IBindableTemplate Interfejs
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia sposób na ASP.NET kontrolek powiązanych z danymi, takich jak DetailsView i FormView, do automatycznego powiązania z kontrolą źródła danych ASP.NET w sekcjach szablonów zawartości.
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
- Pochodne
- Implementuje
Przykłady
Poniższy przykład kodu pokazuje, jak kontrolka FormView może deklaratywnie definiować szablonową zawartość, powiązać je z danymi dostarczonymi przez kontrolkę SqlDataSource oraz wyświetlać i edytować istniejące rekordy. Analizator ASP.NET analizuje szablonową zawartość i tworzy IBindableTemplate obiekt w czasie wykonywania, który może powiązać wartości z kontrolki z SqlDataSource obszarami powiązania danych zdefiniowanymi w szablonie przez jedno ASP.NET kierunkową składnię powiązania danych () i składnię powiązania danych () i dwukierunkową składnię powiązania danych (<%# Eval("fieldname") %>
<%# Bind("fieldname") %>
).
Ważne
Ta kontrolka ma pole tekstowe, które akceptuje dane wejściowe użytkownika, co jest potencjalnym zagrożeniem bezpieczeństwa. Domyślnie ASP.NET strony sieci Web weryfikują, czy dane wejściowe użytkownika nie zawierają skryptów ani elementów HTML. Aby uzyskać więcej informacji, zobacz Omówienie luk w zabezpieczeniach skryptów.
<%@ 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>
Uwagi
Interfejs IBindableTemplate zapewnia możliwość ASP.NET kontrolek powiązanych z danymi, takich jak DetailsView, GridViewi FormView, w celu powiązania z danymi dostarczonymi przez kontrolę źródła danych ASP.NET, na przykład ObjectDataSource lub SqlDataSource, gdy kontrolka powiązana z danymi zawiera szablonową zawartość.
Uwaga
Deweloperzy stron nie implementują interfejsu IBindableTemplate . Deweloperzy tworzący niestandardowe kontrolki powiązane z danymi mogą manipulować IBindableTemplate obiektami we implementacjach PerformDataBinding metod i ExtractRowValues , ale nie implementują własnych IBindableTemplate obiektów.
Kontrolki powiązane z danymi, takie jak GridView zwykle, są świadome drzew kontroli podrzędnej i mogą w związku z tym wiązać wartości z nimi, wyodrębniać z nich wartości i przekazywać te wartości między kontrolką związaną z danymi i kontrolką źródła danych za każdym razem, gdy nastąpi powiązanie danych. Jednak gdy deweloper strony definiuje szablonową zawartość kontrolki powiązanej z danymi, kontrolki podrzędne w szablonie nie są widoczne dla nadrzędnej kontrolki powiązanej z danymi: element nadrzędny może renderować zawartość podrzędną (ponieważ kontrolki skutecznie renderują się), ale nie może wyodrębnić wartości tych kontrolek podrzędnych do przekazania do aktualizacji skojarzonej kontroli źródła danych, operacja wstawiania lub usuwania. W scenariuszach powiązania danych szablonowa zawartość jest nieprzezroczysta dla nadrzędnej kontrolki powiązanej z danymi. Składnia Bind
umożliwia kontrolce powiązanej z danymi wyodrębnianie wartości z danych kontrolnych powiązanych w wystąpieniu IBindableTemplate .
Powiązanie danych może być jednokierunkowe lub dwukierunkowe. (Te kierunki powiązań są definiowane przez wyliczenie BindingDirection ). Powiązanie danych jednokierunkowych to dowolne powiązanie danych wykonywane w kierunku ruchu wychodzącego, od kontroli źródła danych do kontrolki powiązanej z danymi; na przykład każdy scenariusz odczytu danych obejmuje jednokierunkowe powiązanie danych. W przypadku powiązania danych jednokierunkowego można użyć jednokierunkowej składni powiązania danych (<%# Eval("fieldname") %>
) wewnątrz szablonowej zawartości i nie trzeba używać ASP.NET dwukierunkowej składni powiązania danych. Dwukierunkowe powiązanie danych opisuje powiązanie danych w kierunku przychodzącym z kontrolki powiązanej z danymi do kontrolki źródła danych. Scenariusze automatycznego edytowania, wstawiania i usuwania przy użyciu kontrolek ASP.NET powiązanych z danymi i źródła danych są scenariuszami dwukierunkowymi powiązaniami danych. W tych scenariuszach używane są dwukierunkowe wyrażenia powiązania danych (<%# Bind("fieldname") %>
). Interfejs IBindableTemplate i infrastruktura ASP.NET obsługują automatyczne, deklaratywne, dwukierunkowe powiązanie danych między kontrolkami ASP.NET źródła danych i zawartością szablonu. Aby uzyskać więcej informacji na temat ASP.NET wyrażeń powiązań danych i składni, zobacz Binding to Databases and Data-Binding Expressions Overview (Wiązanie z bazami danych i wyrażeniami powiązania danych — omówienie).
Szablonowa zawartość kontrolek powiązanych z danymi jest najczęściej definiowana deklaratywnie. W poniższej tabeli opisano procesy najczęściej używane do powiązania szablonowych danych z kontrolkami powiązanymi z danymi.
Kontrolka powiązana z danymi | Proces |
---|---|
DetailsView | Kontrolka powiązana z danymi jest powiązana z danymi przy użyciu DataSourceID właściwości kontrolki źródła danych, a szablonowa zawartość jest definiowana we ItemTemplateEditItemTemplate właściwości lub InsertItemTemplate . |
GridView | Kontrolka powiązana z danymi jest powiązana z danymi przy użyciu DataSourceID właściwości kontrolki źródła danych, a szablonowa zawartość jest definiowana we ItemTemplate właściwości lub EditItemTemplate . Kontrolka GridView nie obsługuje operacji wstawiania. |
FormView | Kontrolka powiązana z danymi jest powiązana z danymi przy użyciu DataSourceID właściwości, a szablonowa zawartość jest definiowana w ItemTemplatewłaściwości , InsertItemTemplatelub EditItemTemplate w TemplateField obiekcie. |
Kontrolki DataList i Repeater nie obsługują automatycznych scenariuszy powiązania danych dwukierunkowych.
ASP.NET niejawnie tworzy IBindableTemplate obiekt po utworzeniu szablonu zawartości powiązanej z kontrolą źródła danych ASP.NET w szablonie jest analizowany. W szczególności analizator ASP.NET tworzy wystąpienie CompiledBindableTemplateBuilder klasy podczas analizowania szablonowej zawartości, która używa składni powiązania danych ASP.NET i zawiera ASP.NET kontrolki serwera sieci Web, które obsługują powiązanie danych. Te ASP.NET kontrolki serwera są oznaczone przez BindableAttribute atrybut .
Interfejs IBindableTemplate definiuje jedną metodę . ExtractValues Ta metoda jest definiowana dla powiązania danych dwukierunkowego, dzięki czemu kontrolka powiązana z danymi może automatycznie wyodrębniać pary nazw/wartości z szablonowej zawartości i przekazywać pary do kontrolki źródła danych w czasie wykonywania. Aby automatyczne powiązanie danych powiodło się, nazwy pól wyodrębnione z szablonu zawartości przez ExtractValues metodę muszą być zgodne z nazwami parametrów w skojarzonej kontroli źródła danych. Deweloperzy kontrolują metodę ExtractValues jawnie wywoływaną tylko w ramach implementacji ExtractRowValues lub innej podobnej metody niestandardowej kontrolki powiązanej z danymi.
Metody
ExtractValues(Control) |
Po zaimplementowaniu przez klasę pobiera zestaw par nazw/wartości dla wartości powiązanych przy użyciu dwukierunkowej ASP.NET składni powiązania danych w ramach szablonowej zawartości. |
InstantiateIn(Control) |
W przypadku implementacji przez klasę definiuje Control obiekt, do którego należą kontrolki podrzędne i szablony. Te kontrolki podrzędne są z kolei definiowane w szablonie wbudowanym. (Odziedziczone po ITemplate) |