ObjectDataSource未能找到带参数的非泛型方法的的解决以及自定义更新参数的探究
传统ADO.NET的情况下使用ObjectDataSource使得我们可以使用任何数据源作为底层进行CRUD的操作,简单易行。不过ObjectDataSource用的不好往往调试起来很困难(当然这是微软控件封装了太好的缘故:-))。在常见的此类数据源控件出错中,最最常见切频繁出现的就是“XXXDataSource未能找到带参数的……”一类红色的提示。如何解决此类问题呢?
俗话说得好——工欲善其事,必先利其器——我们就从提示入手,仔细研究揣摩ObjectDataSource究竟是如何映射ObjectDataSource的Update方法参数的。
方便期间,我们先创建一个工程(我目前用VS2011 Beta),其中包含一个静态类,用于模拟从数据库中读取的数据资料,以及一个更新方法,大体上代码如下:
[C#]
/// <summary>
/// 实体类
/// </summary>
public class Product
{
public int Id{get;set;}
public string Name{get;set;}
}
public static class DataSourceFile
{
static List<Product> _products = null;
//第一次加载,就初始化仅一次
static DataSourceFile()
{
_products = new List<Product>();
for (int i = 1; i < 11; i++)
{
_products.Add(new Product { Id = i, Name = "Product" + i});
}
}
/// <summary>
/// 选出全部记录的静态方法
/// </summary>
public static IList<Product> GetAllProducts()
{
return _products;
}
public static void UpdateProducts(int Id,string Name)
{
Product up= _products.Find(pro => pro.Id == Id);
up.Name = Name;
}
}
[VB.NET]
''' <summary>
''' 实体类
''' </summary>
Public Class Product
Public Property Id() As Integer
Get
Return m_Id
End Get
Set
m_Id = Value
End Set
End Property
Private m_Id As Integer
Public Property Name() As String
Get
Return m_Name
End Get
Set
m_Name = Value
End Set
End Property
Private m_Name As String
End Class
Public NotInheritable Class DataSourceFile
Private Sub New()
End Sub
Shared _products As List(Of Product) = Nothing
'第一次加载,就初始化仅一次
Shared Sub New()
_products = New List(Of Product)()
For i As Integer = 1 To 10
_products.Add(New Product() With { _
Key .Id = i, _
Key .Name = "Product" & i _
})
Next
End Sub
''' <summary>
''' 选出全部记录的静态方法
''' </summary>
Public Shared Function GetAllProducts() As IList(Of Product)
Return _products
End Function
Public Shared Sub UpdateProducts(Id As Integer,Name As String)
Dim up As Product = _products.Find(Function(pro) pro.Id = Id)
up.Name = Name
End Sub
End Class
对应的aspx代码生成如下:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ProductObjectDataSource" EnableModelValidation="True">
<Columns>
<asp:CommandField ShowEditButton="True" ShowDeleteButton="True" />
<asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" ReadOnly=true />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductObjectDataSource" runat="server" SelectMethod="GetAllProducts"
TypeName="WebCSharp.DataSourceFile"
UpdateMethod="UpdateProducts">
</asp:ObjectDataSource>
这是最简单的情况,假设现在Id是主键(自然只读不允许修改)的情况下,我们在UpdateProducts这里设置断点,然后F5调试,我们便可以发现p已经填充了更新后的数据,但是Id不会发生变化(回传原来的Id),因此可以进行更新。www.zzzyk.com
不过这里提醒大家注意一点:当把objectDataSource绑定到GridView上的时候,默认生成的<asp:ObjectDataSource……>这里边应该还包括了<UpdateParameters>……</UpdateParameters>一节,其中生成的内容与UpdateProducts参
补充:Web开发 , ASP.Net ,