为什么ObjectDataSource需要函数的可选参数?

时间:2016-04-06 16:14:47

标签: .net optional-parameters objectdatasource

连接到以下函数时,此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添加参数来使代码工作,或者我可以重载函数但是这会破坏可选参数的用途。

1 个答案:

答案 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));
}

正如你所说,简单的解决方法是创建一个没有参数的重载。