为什么 ObjectDataSource 需要函数的可选参数?
Why does ObjectDataSource require an optional parameter of a function?
连接到以下函数时,ObjectDataSource
将 return 出错:
<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 'odsActiveProductTypes' could not find a non-generic
method 'GetProductTypes' that has no parameters.
我意识到我可以通过向 ObjectDataSource
添加一个参数来使代码工作,或者我可以重载该函数,但这违背了可选参数的目的。
可以说这是 .NET 中的错误。
当数据源试图找到要绑定的方法时,运行 this code, where 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));
}
如您所说,简单的解决方法是创建一个不带参数的重载。
连接到以下函数时,ObjectDataSource
将 return 出错:
<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 'odsActiveProductTypes' could not find a non-generic method 'GetProductTypes' that has no parameters.
我意识到我可以通过向 ObjectDataSource
添加一个参数来使代码工作,或者我可以重载该函数,但这违背了可选参数的目的。
可以说这是 .NET 中的错误。
当数据源试图找到要绑定的方法时,运行 this code, where 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));
}
如您所说,简单的解决方法是创建一个不带参数的重载。