1

私はvb9と.NETMVCを初めて使用します。EntityFrameworkオブジェクトを渡してselectをビルドさせるMVCヘルパー関数をビルドしたいと思います。一般的に言って、私はこのようなことを試みました:

Public Function RenderSelect(ByVal helper As HtmlHelper, ByVal sSelectName As String, ByVal aItmes As Array, Optional ByVal sTitleKeyName As String = "name", Optional ByVal sValueKeyName As String = "id") As String

        ' open select
        For Each Object In aItmes
            ' here i would like to do something like:
            Dim OptionValue = Object.(sValueKeyName) 
            ' NOTE: I have a var with the property name
            Dim OptionTitle = Object.(sTitleKeyName)

            . then add the option structure to the select
        Next
        ' close select

        Return String
    End Function

ただし、機能していません。これを実行して現在のエンティティオブジェクトを渡す方法があると便利です。データ型は私を打ち負かしています。前もって感謝します。

4

3 に答える 3

0

何が機能していないのですか?コードは実行されますか?文字列を生成しますか?

生成された文字列がHTMLフォームで機能しない原因となるタイプミスが少なくとも1つあります。する必要があります<option value={0}>{1}</option>

編集2:IDictionary(Of Object, String) EFオブジェクトからを取得するにはGetSelectOptions、各オブジェクトにメソッドを追加する部分的なクラス実装を記述します。または、各EFオブジェクトが実装するそのメソッドを使用してインターフェイスを作成します。RenderSelect次に、メソッドを呼び出してEFObject.GetSelectOptions、パラメーターとして渡しSelectOptionsます。

編集:これが私がこれを行う方法です。EFオブジェクトからキーと値のペアを読み取る責任がある呼び出し元のコードを作成します。そうすれば、RenderSelect拡張メソッドをよりクリーンにすることができます。ビューヘルパーメソッドがモデルオブジェクトの構造に依存することは望ましくありません。そして、EFオブジェクトを使用しているという事実にヘルパーメソッドが依存することは確かに望ましくありません。

    Public Function RenderSelect(ByVal helper As HtmlHelper, _
                                 ByVal name As String, _
                                 ByVal SelectOptions As IDictionary(Of Object, String), _
                                 ByVal SelectedKey As Object, _
                                 ByVal htmlAttributes As IDictionary(Of String, Object)) As String
        Dim result = <select name=<%= name %>/>
        Dim optElement As XElement
        For Each opt In SelectOptions
            optElement = <option value=<%= opt.Key.ToString %>><%= opt.Value %></option>
            If opt.Key.Equals(SelectedKey) Then
                optElement.@selected = "1"
            End If
            result.Add(optElement)
        Next
        If htmlAttributes IsNot Nothing Then
            For Each attr In htmlAttributes
                result.SetAttributeValue(attr.Key, attr.Value)
            Next
        End If
        Return result.ToString
    End Function

VB.NETのオーバーロードされたDropDownList関数の完全なセットについては、上記のコードがコピーおよび変更されたvbmvc.codeplex.comプロジェクトからこのファイルを確認してください。

http://vbmvc.codeplex.com/sourcecontrol/changeset/view/19233?projectName=VBMVC#331689

そのコードの戻りタイプはXElementですが、必要に応じてresult.ToStringを使用して要素の文字列表現を取得します。

于 2009-07-20T19:23:58.537 に答える
0

VBが思われる場合の最終的な欠点は、詳細な内省です。プロパティの名前を持つ文字列がある場合、ランダムなオブジェクトでそのプロパティの値を取得する良い方法はありません。何かを機能させるには、各クラスに触れる必要があります。Dennis Palmerの方法は、一般的な選択の作成を可能にするためのおそらく最良の方法です。

だから私は質問を投げかけます:Entity Frameworkチームは、将来のバージョンでこれに役立つ何かを構築しますか?

于 2009-07-28T23:26:25.377 に答える
0

さて、2.0での内省は貧弱ですが、3.5では改善されています。それで、GetTypeをいじり始めるまで、私はこれをほとんどあきらめました、そして私はこれにつまずきました:

Imports System.Runtime.CompilerServices
Imports System.IO

Public Module HtmlCtrlHelper
    <System.Runtime.CompilerServices.Extension()> _
    Public Function RenderSelect(ByVal helper As HtmlHelper, ByVal sName As String, ByVal Itmes As Object, Optional ByVal sValueName As String = "id", Optional ByVal sDisplayName As String = "name") As String
        Dim wOutputSrting As StringWriter = New StringWriter()
        Dim wHtml As HtmlTextWriter = New HtmlTextWriter(wOutputSrting)

        wHtml.RenderBeginTag(HtmlTextWriterTag.Select)

        wHtml.AddAttribute("name", sName)
        wHtml.AddAttribute("id", sName)

        For Each thing As Object In Itmes
            wHtml.RenderBeginTag(HtmlTextWriterTag.Option)
            wHtml.AddAttribute("value", thing.GetType().GetProperty(sValueName).GetValue(thing, Nothing).ToString())
            wHtml.Write(thing.GetType().GetProperty(sDisplayName).GetValue(thing, Nothing).ToString())
            wHtml.RenderEndTag()
        Next

        wHtml.RenderEndTag()

        Return wOutputSrting.ToString()
    End Function
End Module

<%=Html.RenderSelect(Model)%>これで、必要に応じて、自分の見解のように呼び出すことができます。次に、エンティティModelオブジェクトに「id」または「name」属性がない場合は、次のように指定できます。

<%=Html.RenderSelect(Model, "nameofvalue", "nameofdisplay")%>
于 2009-08-14T20:22:55.347 に答える