为什么 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));
}

如您所说,简单的解决方法是创建一个不带参数的重载。