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