ObjectDataSource无法识别过时的方法并将其作为常规方法执行。
ObjectDataSource没有识别过时的属性,因为代码隐藏文件识别过时的方法并在编译/构建期间抛出错误。
public class TEST
{
public TEST()
{
//
// TODO: Add constructor logic here
//
}
[Obsolete("Old method", true)]
public DataTable GetData()
{
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Desc");
for (int i = 0; i < 10; i++)
{
DataRow drow = dt.NewRow();
drow[0] = "Name_" + i.ToString();
drow[1] = "Desc_" + i.ToString();
dt.Rows.Add(drow);
}
return dt;
}
}
ASPX
<form id="form1" runat="server">
<div>
<asp:GridView ID="Gridview1" runat="server" DataSourceID="ObjectDataSource1" EnableModelValidation="True"></asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName="TEST"></asp:ObjectDataSource>
</div>
</form>
ASPX.CS
我在这里错过了任何设置吗?如果需要其他信息,请帮助并告诉我。
提前致谢。
答案 0 :(得分:0)
问题是标记在设计时没有编译。
<asp:ObjectDataSource ID="ObjectDataSource1"
runat="server"
SelectMethod="GetData"
TypeName="TEST">
</asp:ObjectDataSource>
因此,当您在SelectMethod
属性中添加或编辑值时,不会调用任何编译器,因此不会引发错误或警告。
在我们找到的ObsolteAttribute的说明中:
使用变通方法消息和布尔值初始化ObsoleteAttribute类的新实例,该值指示过时元素用法是否被视为错误。
键在这里是用法这个词。当该方法以声明性和/或后期绑定方式使用时,编译器无法检测到它的用法,因此不会引发错误。该方法仍然编译并存在于程序集中。不会引发运行时异常。
ObjectDataSource
实例使用反射来调用该方法。在它的内部深处,你会发现这(简化):
Type type = this.GetType(this.TypeName);
MethodInfo method = type.GetMethod(this.SelectMethod, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
objectDataSourceResult = method.InvokeMethod(this, null);
它基本上在运行时查找方法并调用它。您甚至可以在运行时更改SelectMethod
的值,代码仍然有效。编译程序集后,不会考虑过时的属性。