c# asp.net gridview objectdatasource

c# - ObjectDataSource Gridview Insert Fails W/Empty Values ​​Dictionary



asp.net (1)

Tengo una vista de cuadrícula a la que he creado una Plantilla de inserción en la fila del pie de página.

Tengo un ObjectDataSource que está vinculado a un objeto comercial.

Tengo un controlador de eventos OnInserting que nunca se dispara.

El programa encuentra un error una vez que llamo. Inserte en ObjectDataSource. El error que recibo es que no hay valores y que debo verificar para asegurarme de que el diccionario de valores no esté vacío.

No veo una forma de insertar con un diccionario como parámetro. He visto mencionar el uso de ObjectDataSourceView y su método de inserción, pero no veo ninguna mención de cómo hacerlo y MSDN afirma que no tiene acceso.

¿Es la reflexión el camino a seguir aquí? ¿Hay una mejor manera de tener una fila de inserción en una vista de cuadrícula? ¿Me estoy perdiendo algo obvio en mis pasos aquí?

A continuación está el código:
ObjectDataSource:

<asp:ObjectDataSource ID="LeasesDS" runat="server" OnInserting="LeasesDS_Inserting" DataObjectTypeName="CLS.BusObjects.LeaseObj" DeleteMethod="Delete" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetLeasesByCustomerID" TypeName="CLS.BusObjects.LeaseObj" UpdateMethod="Update"> <SelectParameters> <asp:Parameter Name="customerID" Type="Int32" /> </SelectParameters> <InsertParameters> <asp:Parameter Name="CustomerID" Type="Int32" /> <asp:Parameter Name="PurchaseDate" Type="DateTime" /> <asp:Parameter Name="AutoYear" Type="Int32" /> <asp:Parameter Name="Make" Type="String" /> <asp:Parameter Name="Model" Type="String" /> <asp:Parameter Name="LeaseEndDate" Type="DateTime" /> </InsertParameters> </asp:ObjectDataSource>


Métodos de CodeBehind:

protected void LeasesGrid_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "Insert" && Page.IsValid) { LeasesDS.Insert(); } } protected void LeasesDS_Inserting(object sender, ObjectDataSourceMethodEventArgs e) { DropDownList GridCustomersList = (DropDownList)LeasesGrid.FooterRow.FindControl("GridCustomersList"); TextBox PurchaseDate = (TextBox)LeasesGrid.FooterRow.FindControl("PurchaseDate"); TextBox AutoYear = (TextBox)LeasesGrid.FooterRow.FindControl("AutoYear"); TextBox Make = (TextBox)LeasesGrid.FooterRow.FindControl("Make"); TextBox Model = (TextBox)LeasesGrid.FooterRow.FindControl("Model"); TextBox LeaseEndDate = (TextBox)LeasesGrid.FooterRow.FindControl("LeaseEndDate"); e.InputParameters["CustomerID"] = Convert.ToInt32(GridCustomersList.SelectedValue); DateTime? purchaseDate = null; if (!string.IsNullOrEmpty(PurchaseDate.Text)) purchaseDate = Convert.ToDateTime(PurchaseDate.Text); e.InputParameters["PurchaseDate"] = purchaseDate; int? autoYear = null; if (!string.IsNullOrEmpty(AutoYear.Text)) autoYear = Convert.ToInt32(AutoYear.Text); e.InputParameters["AutoYear"] = autoYear; string make = null; if (!string.IsNullOrEmpty(Make.Text)) make = Make.Text; e.InputParameters["Make"] = make; string model = null; if (!string.IsNullOrEmpty(Model.Text)) model = Model.Text; e.InputParameters["Model"] = model; DateTime? leaseEndDate = null; if (!string.IsNullOrEmpty(LeaseEndDate.Text)) leaseEndDate = Convert.ToDateTime(LeaseEndDate.Text); e.InputParameters["LeaseEndDate"] = leaseEndDate; }


Su ejemplo no es coherente ya que tiene DataObjectTypeName establecido, pero su método LeasesDS_Inserting está agregando parámetros como si no lo fuera.

Si no necesita DataObjectTypeName, puede eliminarlo y entonces debería tener una mejor oportunidad para que esto funcione.

Si necesita DataObjectTypeName o simplemente lo prefiere (como yo lo hago), hay una manera de hacer que esto funcione, pero no es bonito.

En su método LeasesGrid_RowCommand, puede usar un código como este para obtener la vista:

IDataSource ds = (IDataSource)LeasesDS; DataSourceView view = ds.GetView(LeasesGrid.DataMember);

Después de obtener la vista, puede compilar un diccionario que contenga los valores que deben escribirse en el objeto de datos que eventualmente será transferido a su método de inserción. El código para eso se verá muy similar a lo que tienes en LeasesDS_Inserting, pero lo insertarás en tu propio diccionario en lugar de e.InputParameters.

Una vez que tenga listo su diccionario, puede invocar Insertar en la vista con algo como esto:

view.Insert(dict, delegate { return false; });

Deberias hacer eso.

Ya no necesitará el método LeasesDS_Inserting ya que el método Insert de la vista hará el trabajo de convertir el diccionario que le dio al objeto de datos que va a pasar a su método Insert.

Si necesita hacer más procesamiento de las propiedades en ese objeto de datos, lo verá en el diccionario InputParameters pasado a LeasesDS_Inserting.