怎么样解决使用GridView与ObjectDataSource绑定抱错对象目标类型的问题?
ObjectDataSource类可以使用用户自定义的类,并实现数据绑定的操作与自定义类的方法相关联,通过反射调用方法;上周自己作了个小程序,就是完成自定义类实现数据的绑定功能;
程序如下:
default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ObjectDataSourceTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"> </asp:GridView> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetCreateTime" TypeName="ObjectDataSourceTest.App_Code.BLL" OnObjectCreating="GetBLL" OnObjectDisposing="ReturnBLL"></asp:ObjectDataSource> </div> </form> </body> </html>default.aspx.cs
using System;
using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using ObjectDataSourceTest.App_Code;namespace ObjectDataSourceTest
{ public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { }protected void GetEmployeeLogic(object sender, ObjectDataSourceEventArgs e)
{ BLL cachedLogic = null; cachedLogic = Cache["BLLObject"] as BLL; if (null == cachedLogic) { cachedLogic = new BLL(DateTime.Now); }e.ObjectInstance = cachedLogic;
}
protected void ReturnEmployeeLogic(Object sender, ObjectDataSourceDisposingEventArgs e)
{ BLL cachedLogic = e.ObjectInstance as BLL;BLL temp = Cache["BLLObject"] as BLL;
if (null == temp)
{ Cache.Insert("BLLObject", cachedLogic); }e.Cancel = true;
} } }BLL.cs
using System;
using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections.Generic;namespace ObjectDataSourceTest.App_Code
{ public classBLL { public BLL() : this(DateTime.Now) { }public BLL(DateTime createDateTime)
{ _createDateTime = createDateTime; }private DateTime _createDateTime;
publicList<string> GetCreateTime()
{ List<string> al = new List<string>(); al.Add("创建时间" + _createDateTime); return al; } } }但程序调试时总是报"对象与目标类型不匹配"的错误,知道是类型不对,但当时找了半天毛病,就是不知道是那里不对,最后怀疑是ObjectDataSource控件的TypeName属性,
先看看MSDN怎么说:
为创建 ObjectDataSource 控件绑定到的对象的实例,控件在运行时使用反射加载由类型名称标识的类型。因此,TypeName 属性的值可以是位于 Bin 或 App_Code 目录中的代码的部分限定类型,也可以是在全局程序集缓存中注册的代码的完全限定类型名称。如果使用全局程序集缓存,必须将相应的引用添加到 Machine.config 或 Web.config 文件中的 assemblies 节。ObjectDataSource控件 - 《ASP.NET 2.0技术内幕》描述:
ObjectdataSource控件使用映射来定位和调用处理指定操作的方法。TypeName属性返回定义了要调用的类的程序集的完全限定名。如果该类定义在App_Code目录中,则不需要指示程序集名称。否则,使用一个以逗号分隔的字符串,其形式为[classname, assembly]控件使用映射来定位和调用处理指定操作的方法。关键就在"如果该类定义在App_Code目录中,则不需要指示程序集名称。否则,使用一个以逗号分隔的字符串,其形式为[classname, assembly]."
不管怎么样,先将TypeName修改为[classname, assembly]形式,程序执行成功;但我的BLL就是放在App_Code文件夹下的,郁闷!!<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetCreateTime" TypeName="ObjectDataSourceTest.App_Code.BLL, ObjectDataSourceTest"
OnObjectCreating="GetBLL" OnObjectDisposing="ReturnBLL"></asp:ObjectDataSource>