ObjectDataSource.UpdateMethod Propriété
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Obtient ou définit le nom de la méthode ou de la fonction que le contrôle ObjectDataSource appelle pour mettre à jour des données.
public:
property System::String ^ UpdateMethod { System::String ^ get(); void set(System::String ^ value); };
public string UpdateMethod { get; set; }
member this.UpdateMethod : string with get, set
Public Property UpdateMethod As String
Valeur de propriété
Chaîne qui représente le nom de la méthode ou de la fonction que ObjectDataSource utilise pour mettre à jour des données. La valeur par défaut est une chaîne vide.
Exemples
Les trois exemples suivants montrent une page Web, une classe de page code-behind et une classe d’accès aux données qui permettent à un utilisateur de récupérer et de mettre à jour des enregistrements dans la table Employees de la base de données Northwind.
Le premier exemple montre une page Web qui contient deux ObjectDataSource contrôles, un DropDownList contrôle et un DetailsView contrôle. Le premier ObjectDataSource contrôle et le DropDownList contrôle sont utilisés pour récupérer et afficher les noms des employés de la base de données. Le deuxième ObjectDataSource contrôle et le DetailsView contrôle sont utilisés pour récupérer, afficher et modifier les données de l’enregistrement d’employé sélectionné par l’utilisateur.
<form id="Form1" method="post" runat="server">
<asp:objectdatasource
ID="ObjectDataSource1"
runat="server"
SelectMethod="GetFullNamesAndIDs"
TypeName="Samples.AspNet.CS.EmployeeLogic" />
<p>
<asp:dropdownlist
ID="DropDownList1"
runat="server"
DataSourceID="ObjectDataSource1"
DataTextField="FullName"
DataValueField="EmployeeID"
AutoPostBack="True"
AppendDataBoundItems="true">
<asp:ListItem Text="Select One" Value=""></asp:ListItem>
</asp:dropdownlist>
</p>
<asp:objectdatasource
ID="ObjectDataSource2"
runat="server"
SelectMethod="GetEmployee"
UpdateMethod="UpdateEmployeeAddress"
OnUpdating="EmployeeUpdating"
OnSelected="EmployeeSelected"
TypeName="Samples.AspNet.CS.EmployeeLogic" >
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
</SelectParameters>
</asp:objectdatasource>
<asp:DetailsView
ID="DetailsView1"
runat="server"
DataSourceID="ObjectDataSource2"
AutoGenerateRows="false"
AutoGenerateEditButton="true">
<Fields>
<asp:BoundField HeaderText="Address" DataField="Address" />
<asp:BoundField HeaderText="City" DataField="City" />
<asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
</Fields>
</asp:DetailsView>
</form>
<form id="form1" runat="server">
<asp:objectdatasource
ID="ObjectDataSource1"
runat="server"
SelectMethod="GetFullNamesAndIDs"
TypeName="Samples.AspNet.CS.EmployeeLogic" />
<p>
<asp:dropdownlist
ID="DropDownList1"
runat="server"
DataSourceID="ObjectDataSource1"
DataTextField="FullName"
DataValueField="EmployeeID"
AutoPostBack="True"
AppendDataBoundItems="true">
<asp:ListItem Text="Select One" Value=""></asp:ListItem>
</asp:dropdownlist>
</p>
<asp:objectdatasource
ID="ObjectDataSource2"
runat="server"
SelectMethod="GetEmployee"
UpdateMethod="UpdateEmployeeAddress"
OnUpdating="EmployeeUpdating"
OnSelected="EmployeeSelected"
TypeName="Samples.AspNet.CS.EmployeeLogic" >
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
</SelectParameters>
</asp:objectdatasource>
<asp:DetailsView
ID="DetailsView1"
runat="server"
DataSourceID="ObjectDataSource2"
AutoGenerateRows="false"
AutoGenerateEditButton="true">
<Fields>
<asp:BoundField HeaderText="Address" DataField="Address" />
<asp:BoundField HeaderText="City" DataField="City" />
<asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
</Fields>
</asp:DetailsView>
</form>
Le deuxième exemple montre des gestionnaires pour les Selected événements et Updating . Le Selected gestionnaire d’événements sérialise l’objet qui contient les données récupérées à partir de la table Employee. L’objet sérialisé est stocké dans l’état d’affichage. Le Updating gestionnaire d’événements désérialise l’objet dans l’état d’affichage qui contient les données d’origine de l’enregistrement de données en cours de mise à jour. L’objet qui contient les données d’origine est passé en tant que paramètre à la méthode Update. Les données d’origine doivent être passées à la base de données afin qu’elles puissent être utilisées pour vérifier si les données ont été modifiées par un autre processus.
public void EmployeeUpdating(object source, ObjectDataSourceMethodEventArgs e)
{
DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));
String xmlData = ViewState["OriginalEmployee"].ToString();
XmlReader reader = XmlReader.Create(new StringReader(xmlData));
Employee originalEmployee = (Employee)dcs.ReadObject(reader);
reader.Close();
e.InputParameters.Add("originalEmployee", originalEmployee);
}
public void EmployeeSelected(object source, ObjectDataSourceStatusEventArgs e)
{
if (e.ReturnValue != null)
{
DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
dcs.WriteObject(writer, e.ReturnValue);
writer.Close();
ViewState["OriginalEmployee"] = sb.ToString();
}
}
Public Sub EmployeeUpdating(ByVal source As Object, ByVal e As ObjectDataSourceMethodEventArgs)
Dim dcs As New DataContractSerializer(GetType(Employee))
Dim xmlData As String
Dim reader As XmlReader
Dim originalEmployee As Employee
xmlData = ViewState("OriginalEmployee").ToString()
reader = XmlReader.Create(New StringReader(xmlData))
originalEmployee = CType(dcs.ReadObject(reader), Employee)
reader.Close()
e.InputParameters.Add("originalEmployee", originalEmployee)
End Sub
Public Sub EmployeeSelected(ByVal source As Object, ByVal e As ObjectDataSourceStatusEventArgs)
If e.ReturnValue IsNot Nothing Then
Dim dcs As New DataContractSerializer(GetType(Employee))
Dim sb As New StringBuilder()
Dim writer As XmlWriter
writer = XmlWriter.Create(sb)
dcs.WriteObject(writer, e.ReturnValue)
writer.Close()
ViewState("OriginalEmployee") = sb.ToString()
End If
End Sub
Le troisième exemple montre la classe d’accès aux données qui interagit avec la base de données Northwind. La classe utilise LINQ pour interroger et mettre à jour la table Employees. L’exemple nécessite une classe LINQ to SQL qui représente la base de données Northwind et la table Employees. Pour plus d’informations, consultez Guide pratique pour créer des classes LINQ to SQL dans un projet web.
public class EmployeeLogic
{
public static Array GetFullNamesAndIDs()
{
NorthwindDataContext ndc = new NorthwindDataContext();
var employeeQuery =
from e in ndc.Employees
orderby e.LastName
select new { FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID };
return employeeQuery.ToArray();
}
public static Employee GetEmployee(int empID)
{
if (empID < 0)
{
return null;
}
else
{
NorthwindDataContext ndc = new NorthwindDataContext();
var employeeQuery =
from e in ndc.Employees
where e.EmployeeID == empID
select e;
return employeeQuery.Single();
}
}
public static void UpdateEmployeeAddress(Employee originalEmployee, string address, string city, string postalcode)
{
NorthwindDataContext ndc = new NorthwindDataContext();
ndc.Employees.Attach(originalEmployee, false);
originalEmployee.Address = address;
originalEmployee.City = city;
originalEmployee.PostalCode = postalcode;
ndc.SubmitChanges();
}
}
Public Class EmployeeLogic
Public Shared Function GetFullNamesAndIDs() As Array
Dim ndc As New NorthwindDataContext()
Dim employeeQuery = _
From e In ndc.Employees _
Order By e.LastName _
Select FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID
Return employeeQuery.ToArray()
End Function
Public Shared Function GetEmployee(ByVal empID As Integer) As Employee
If (empID < 0) Then
Return Nothing
Else
Dim ndc As New NorthwindDataContext()
Dim employeeQuery = _
From e In ndc.Employees _
Where e.EmployeeID = empID _
Select e
Return employeeQuery.Single()
End If
End Function
Public Shared Sub UpdateEmployeeAddress(ByVal originalEmployee As Employee, ByVal address As String, ByVal city As String, ByVal postalcode As String)
Dim ndc As New NorthwindDataContext()
ndc.Employees.Attach(originalEmployee, False)
originalEmployee.Address = address
originalEmployee.City = city
originalEmployee.PostalCode = postalcode
ndc.SubmitChanges()
End Sub
End Class
Remarques
Le ObjectDataSource contrôle suppose que la méthode identifiée par la UpdateMethod propriété effectue des mises à jour une par une, plutôt que dans un lot.
La UpdateMethod propriété délègue à la UpdateMethod propriété de l’objet ObjectDataSourceView associé au ObjectDataSource contrôle .
Assurez-vous que les noms de paramètres configurés pour le ObjectDataSource contrôle dans la UpdateParameters collection correspondent aux noms de colonnes retournés par la méthode select.
Durée de vie des objets
La méthode identifiée par la UpdateMethod propriété peut être une méthode d’instance ou une static
méthode (Shared
en Visual Basic). S’il s’agit d’une méthode d’instance, l’objet métier est créé et détruit chaque fois que la méthode spécifiée par la UpdateMethod propriété est appelée. Vous pouvez gérer les ObjectCreated événements et ObjectCreating pour travailler avec l’objet métier avant que la méthode spécifiée par la UpdateMethod propriété soit appelée. Vous pouvez également gérer l’événement ObjectDisposing déclenché après l’appel de la méthode spécifiée par la UpdateMethod propriété . Si l’objet métier implémente l’interface IDisposable , la Dispose méthode est appelée avant la destruction de l’objet. Si la méthode est static
(Shared
en Visual Basic), l’objet métier n’est jamais créé et vous ne pouvez pas gérer les ObjectCreatedévénements , ObjectCreatinget ObjectDisposing .
Fusion de paramètres
Les paramètres sont ajoutés à la UpdateParameters collection à partir de trois sources :
À partir du contrôle lié aux données, au moment de l’exécution.
À partir de l’élément
UpdateParameters
, de façon déclarative.À partir du Updating gestionnaire d’événements, par programmation.
Tout d’abord, tous les paramètres générés à partir de contrôles liés aux données sont ajoutés à la UpdateParameters collection. Par exemple, si le ObjectDataSource contrôle est lié à un GridView contrôle qui a les colonnes Name
et Number
, les paramètres pour Name
et Number
sont ajoutés à la collection. Le nom exact du paramètre dépend de la OldValuesParameterFormatString propriété . Le type de données de ces paramètres est string
. Ensuite, les paramètres répertoriés dans l’élément UpdateParameters
sont ajoutés. Si un paramètre dans l’élément UpdateParameters
est trouvé avec le même nom qu’un paramètre qui se trouve déjà dans la UpdateParameters collection, le paramètre existant est modifié pour correspondre au paramètre spécifié dans l’élément UpdateParameters
. En règle générale, il est utilisé pour modifier le type des données dans le paramètre . Enfin, vous pouvez ajouter et supprimer par programmation des paramètres dans l’événement Updating , ce qui se produit avant l’exécution de la Update méthode. La méthode est résolue après la fusion des paramètres. La résolution de méthode est abordée dans la section suivante.
Important
Vous devez valider toute valeur de paramètre que vous recevez du client. Le runtime remplace simplement la valeur du paramètre dans la UpdateMethod propriété .
Résolution de méthode
Lorsque la Update méthode est appelée, les champs de données du contrôle lié aux données, les paramètres créés de manière déclarative dans l’élément UpdateParameters
et les paramètres ajoutés dans le Updating gestionnaire d’événements sont tous fusionnés. (Pour plus d’informations, consultez la section précédente.) Le ObjectDataSource contrôle tente ensuite de trouver une méthode à appeler. Tout d’abord, il recherche une ou plusieurs méthodes portant le nom spécifié dans la UpdateMethod propriété . Si aucune correspondance n’est trouvée, une InvalidOperationException exception est levée. Si une correspondance est trouvée, il recherche ensuite les noms de paramètres correspondants. Par exemple, supposons qu’un type spécifié par la TypeName propriété possède deux méthodes nommées UpdateARecord
. L’un UpdateARecord
a un paramètre, ID
, et l’autre UpdateARecord
a deux paramètres, Name
et Number
. Si la UpdateParameters collection n’a qu’un seul paramètre nommé ID
, la UpdateARecord
méthode avec uniquement le ID
paramètre est appelée. Le type du paramètre n’est pas archivé pour résoudre les méthodes. L’ordre des paramètres n’a pas d’importance.
Si la DataObjectTypeName propriété est définie, la méthode est résolue d’une autre manière. Recherche ObjectDataSource une méthode avec le nom spécifié dans la UpdateMethod propriété qui prend un paramètre du type spécifié dans la DataObjectTypeName propriété . Dans ce cas, le nom du paramètre n’a pas d’importance.