vb.net
  • html-helper
  • 2014-03-01 86 views 0 likes 
    0

    我有一个用于我的webforms项目的html helper类。到目前为止,它可以返回字符串来创建标签和只读字段。如何将一个属性传递给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

    您可以传递一个属性作为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) 
    

    希望这个例子给你一个关于如何处理这个问题的粗略概述。请注意,特别是表达式的分析被简化了。在现实世界的代码中会有各种检查来确保表达符合您的期望。

    +0

    我试着实现你描述的签名,并且我得到一些错误。如果我在代码隐藏中调用:“未为'public func ...'的参数'expr'指定的参数”并且“Parameter'm'将属性MyForm.m隐藏为MytableRow' 如果我将它包含在标记中:”Can not将类型'lambda表达式'转换为参数类型'String'。 请记住,我在webforms中使用这个函数,并没有Html对象或MVC解析。 – Sergio

    +0

    @Sergio:对不起,一切看起来“如此MVC”,我走错了方向。我已经更新了我的答案,以显示没有MVC帮手的方式。 – Markus

    +0

    编辑完成后,代码运行良好。然而,我不得不这样做这样的调用:<%= DisplayFor(myModelVar,Function(m As myModelVarClass)m.MyProperty)%>这有点烦人。有没有办法消除定义m类型的需要,还是必须通过MyRow并只从字段中获取值?无论如何,谢谢。那小小的代码将会让我无法写出很多东西! – Sergio

    相关问题