连接到以下函数时,此ObjectDataSource
将返回错误:
<asp:ObjectDataSource ID="odsActiveProductTypes" runat="server" SelectMethod="GetProductTypes" TypeName="MyRepo">
带可选参数的函数:
Public Function GetProductTypes(Optional ByVal activeOnly As Boolean = True) As IQueryable(Of ProductType)
If activeOnly Then
Return MyContext.ProductTypes.Where(Function(pt) pt.Active = True)
Else
Return MyContext.ProductTypes
End If
End Function
这是错误:
ObjectDataSource&#39; odsActiveProductTypes&#39;找不到非通用的 方法&#39; GetProductTypes&#39;没有参数。
我意识到我可以通过向ObjectDataSource
添加参数来使代码工作,或者我可以重载函数但是这会破坏可选参数的用途。
答案 0 :(得分:3)
这可以说是.NET中的一个错误。
当数据源试图找到要绑定的方法时,它正在运行this code,其中part of it正在检查:
if (methodParametersCount != allParameterCount) {
continue;
}
其中methodParametersCount
是您方法中的参数计数,在您的情况下为1,尽管是可选的。由于您没有给它传递给方法的任何参数,allParameterCount
为0,因此它继续寻找更多方法。
没有找到任何内容,ends up检查它是否与方法匹配。如果没有,它会再次检查您提供的参数数量,如果为0(如您所示),则会抛出您看到的异常:
if (allParameterCount == 0) {
throw new InvalidOperationException(SR.GetString(SR.ObjectDataSourceView_MethodNotFoundNoParams, _owner.ID, methodName));
}
正如你所说,简单的解决方法是创建一个没有参数的重载。