VB.NET/VBHTML 多个表达式

VB.NET/VBHTML Multiple Expressions

帮手:

<Extension()>
    Public Function InputRow(Of TModel, TProperty)(ByVal helper As HtmlHelper(Of TModel),
                                                    ByVal exp1 As Expression(Of Func(Of TModel, TProperty)),
                                                    ByVal exp2 As Expression(Of Func(Of TModel, TProperty)),
                                                    ByVal exp3 As Expression(Of Func(Of TModel, TProperty)),
                                                    Optional cl As CL = Nothing,
                                                    Optional split As List(Of Integer) = Nothing) As MvcHtmlString

      Dim expressions As New List(Of Expression(Of Func(Of TModel, TProperty))) From {expression1, expression2, expression3}

      Return InputRow(helper, expressions, cl, split)
    End Function
    

VBHTML:

  @Html.InputRow(Function(x) Model.Test, Function(y) Model.Test1, Function(z) Model.Test2)

我不是很了解 TModel 和 TProperty,也找不到太多关于它的资料。我遇到的问题是变量 Model.Test 是可为空的整数,而 Model.Test1 和 Model.Test2 是可为空的小数。 当我尝试获取 Model.Test 的元数据时,它抛出异常。

获取元数据:

metaData = ModelMetadata.FromLambdaExpression(exp, helper.ViewData)

异常:

System.InvalidOperationException: 'Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.'

它试图在幕后转换整数?到十进制?,但我不知道为什么。 Model.Test 表达式为:

{x => Convert(value(ASP._Page_Views_Test_vbhtml).Model.Test)}

Convert 中包装的值抛出异常,但我不知道为什么它被包装在 convert 中。如果我从方法参数中删除 exp2 和 exp3。转换没有发生。

旁注: 将多个表达式传递给一个方法是错误的吗?如果没有,是否有办法将 TModel、TProperty 表达式列表传递给帮助程序。而不是有单独的变量?

在此先感谢您的帮助。

我认为这里的问题是您希望仅使用一个泛型类型参数传递任意类型的多个表达式。因为只有一个 TProperty,所以您的三个表达式必须涉及同一类型的属性,例如所有 String 或所有 Integer。如果您希望能够使用三种不同的类型,那么您需要三种不同的泛型类型参数:

Public Function InputRow(Of TModel, TProperty1, TProperty2, TProperty3)(
    helper As HtmlHelper(Of TModel),
    exp1 As Expression(Of Func(Of TModel, TProperty1)),
    exp2 As Expression(Of Func(Of TModel, TProperty2)),
    exp3 As Expression(Of Func(Of TModel, TProperty3)),
    Optional cl As CL = Nothing,
    Optional split As List(Of Integer) = Nothing) As MvcHtmlString