如何将属性传递给html帮助器方法

时间:2014-03-01 17:08:17

标签: vb.net html-helper

我的webforms项目有一个html助手类。到目前为止,它可以返回字符串来创建标签和只读字段。

Public Shared Function DisplayFor(value As String, Optional attributes As String = "") As String
    Return [String].Format("<span class='uneditable-input {0}'>{1}</span>", GetSStyle(attributes), value)
End Function

现在我想创建一些可以接受传递实体属性的重载,以便它可以在内部检查数据类型(来自属性)并显示格式化的内容,例如。就像MVC一样。

唯一的问题是我不知道如何将类属性作为函数参数传递。

1 个答案:

答案 0 :(得分:1)

您可以将属性作为Expression(Of Func(Of MyModel, String))传递,然后通过该属性接收您可以分析和评估的方法中的表达式:

Public Shared Function DisplayFor(Of TModel, TValue)(model As TModel, expr As Expression(Of Func(Of TModel, TValue))) As String
    ' Retrieve the value dynamically
    Dim compExpr = expr.Compile()
    Dim value = compExpr.DynamicInvoke(model)
    Dim retVal As String
    If value Is Nothing Then
        retVal = String.Empty
    Else
        retVal = value.ToString()
    End If
    ' Analyze expression body
    Dim memberAccExpr = DirectCast(expr.Body, 
                          System.Linq.Expressions.MemberAccessExpression)
    Dim attr = memberAccExpr.Member.GetCustomAttributes(typeof(MyDisplayAttribute), false).Cast(Of MyDisplayAttribute)().FirstOrDefault();
    Return retVal
End Function

调用这样的方法:

DisplayFor(myModelVar, Function(m) m.MyProperty)

我希望这个示例能够为您提供有关如何处理此问题的大致概述。请注意,特别是表达体的分析被简化了。在现实世界的代码中,会有各种检查以确保表达式符合您的期望。