Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original. |
Traducción
Original
|
ObjectDataSource.UpdateMethod (Propiedad)
Obtiene o establece el nombre del método o la función que invoca el control ObjectDataSource para actualizar los datos.
Ensamblado: System.Web (en System.Web.dll)
Valor de propiedad
Tipo: System.StringCadena que representa el nombre del método o la función que ObjectDataSource utiliza para actualizar los datos. El valor predeterminado es una cadena vacía.
El control ObjectDataSource presupone que el método identificado por la propiedad UpdateMethod lleva a cabo las actualizaciones de una en una, y no por lotes.
La propiedad UpdateMethod delega en la propiedad UpdateMethod del objeto ObjectDataSourceView, que está asociado al control ObjectDataSource.
Asegúrese de que los nombres de parámetro configurados para el control ObjectDataSource en la colección UpdateParameters coincida con los nombres de columna devueltos por el método select.
Duración de objetos
El método identificado por la propiedad UpdateMethod puede ser un método de instancia o un método static (Shared en Visual Basic). Si es un método de instancia, el objeto comercial se crea y se destruye cada vez que se llama al método especificado por la propiedad UpdateMethod. Se pueden controlar los eventos ObjectCreated y ObjectCreating para que funcionen con el objeto comercial antes de llamar al método especificado por la propiedad UpdateMethod. También puede controlar el evento ObjectDisposing que se provoca después de llamar al método especificado por la propiedad UpdateMethod. Si el objeto comercial implementa la interfaz IDisposable, se llama al método Dispose antes de que se destruya el objeto. Si el método es un método static (Shared en Visual Basic), nunca se creará el objeto comercial y no será posible controlar los eventos ObjectCreated, ObjectCreating y ObjectDisposing.
Combinación de parámetros
Los parámetros se agregan a la colección UpdateParameters desde tres orígenes:
-
Desde el control enlazado a datos, en tiempo de ejecución.
-
Desde el elemento UpdateParameters, mediante declaración.
-
Desde el controlador de eventos Updating, mediante programación.
En primer lugar, se agrega cualquier parámetro que se genere desde los controles enlazados a datos a la colección UpdateParameters. Por ejemplo, si el control ObjectDataSource está enlazado a un control GridView que tiene las columnas Name y Number, se agregan a la colección los parámetros Name y Number. El nombre exacto del parámetro depende de la propiedad OldValuesParameterFormatString. El tipo de datos de estos parámetros es string. Luego, se agregan los parámetros que se enumeran en el elemento UpdateParameters. Si uno de los parámetros del elemento UpdateParameters tiene el mismo nombre que un parámetro que ya se encuentra en la colección UpdateParameters, el parámetro existente se modifica para que coincida con el parámetro especificado en el elemento UpdateParameters. Normalmente, esto se utiliza para modificar el tipo de datos del parámetro. Por último, puede agregar y quitar mediante programación parámetros del evento Updating, que aparece antes de la ejecución del método Update. El método se resuelve después de que se combinen los parámetros. La resolución del método se describe en la siguiente sección.
Nota sobre la seguridad
|
|---|
|
Debe validar todos los valores de parámetro que reciba del cliente. El motor en tiempo de ejecución simplemente sustituye el valor del parámetro en la propiedad UpdateMethod. |
Resolución de métodos
Cuando se llama al método Update, se combinan los campos de datos del control enlazado a datos, los parámetros creados mediante declaración en el elemento UpdateParameters y los parámetros agregados al controlador de eventos Updating. (Para obtener más información, vea la sección anterior). Después, el control ObjectDataSource intenta encontrar un método al que llamar. En primer lugar, busca uno o más métodos con el nombre especificado en la propiedad UpdateMethod. Si no se encuentra ninguna coincidencia, se produce una excepción InvalidOperationException. Si aparece una coincidencia, entonces se buscan nombres de parámetro coincidentes. Por ejemplo, supongamos que un tipo especificado por la propiedad TypeName tiene dos métodos denominados UpdateARecord. Un UpdateARecord tiene un parámetro, ID y, el otro UpdateARecord tiene dos parámetros, Name y Number. Si la colección UpdateParameters tiene sólo un parámetro denominado ID, se llamará al método UpdateARecord con el parámetro ID únicamente. El tipo del parámetro no se comprueba para resolver los métodos. El orden de los parámetros es indiferente.
Si se establece la propiedad DataObjectTypeName, se resuelve el método de un modo distinto. ObjectDataSource busca un método con el nombre especificado en la propiedad UpdateMethod que acepta un parámetro del tipo especificado en la propiedad DataObjectTypeName. En este caso, el nombre del parámetro no importa.
En los tres ejemplos siguientes se muestran una página web, una clase de página de código subyacente y una clase de acceso a datos que permiten al usuario recuperar y actualizar registros de la tabla Employees en la base de datos Northwind.
En el primer ejemplo se muestra una página web que contiene dos controles ObjectDataSource, un control DropDownList y un control DetailsView. El primer control ObjectDataSource y el control DropDownList se utilizan para recuperar y mostrar los nombres de empleados de la base de datos. El segundo control ObjectDataSource y el control DetailsView se utilizan para recuperar, mostrar y modificar los datos del registro de empleado seleccionado por el usuario.
<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>
En el segundo ejemplo se muestran los controladores de los eventos Selected y Updating. El controlador de eventos Selected serializa el objeto que contiene los datos recuperados de la tabla Employee. El objeto serializado se almacena en el estado de vista. El controlador de eventos Updating deserializa el objeto en el estado de vista que contiene los datos originales del registro de datos que se actualiza. El objeto que contiene los datos originales se pasa como parámetro al método Update. Los datos originales se deben pasar a la base de datos con el fin de poder utilizarlos para comprobar si otro proceso los ha modificado.
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(); } }
En el tercer ejemplo se muestra la clase de acceso a datos que interactúa con la base de datos Northwind. La clase utiliza LINQ para consultar y actualizar la tabla Employees. El ejemplo requiere una clase LINQ to SQL que represente la base de datos Northwind y la tabla Employees. Para obtener más información, vea Cómo: Crear clases de LINQ to SQL en un proyecto 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(); } }
Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2
.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Nota sobre la seguridad