当前位置:编程学习 > asp >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,