怎么样解决使用GridView与ObjectDataSource绑定抱错对象目标类型的问题?

怎么样解决使用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>

怎么样解决使用GridView与ObjectDataSource绑定抱错对象目标类型的问题?怎么样解决使用GridView与ObjectDataSource绑定抱错对象目标类型的问题?