vb.net
  • html-helper
  • 2014-03-01 119 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

    相關問題