ObjectDataSource.UpdateMethod Propriété

Définition

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 case activée 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 instance ou une static méthode (Shared en Visual Basic). S’il s’agit d’une méthode 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.

S’applique à

Voir aussi