2009-07-20 2 views
1

Ich bin neu in vb9 und .NET MVC. Ich möchte eine MVC-Hilfsfunktion erstellen, für die ich ein Entity Framework-Objekt übergebe und ein Select erstellen lasse. Im Allgemeinen habe ich etwas wie dieses versucht:Eigenschaften von dynamischen Objekten in einem MVC-Hilfsprogramm für ein Entity Framework-Objekt

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 

Jedoch funktioniert es nicht. Es wäre großartig, eine Möglichkeit zu haben, dies zu tun und das aktuelle Entitätsobjekt zu übergeben. Die Datentypen verprügeln mich. Danke im Voraus.

+0

Vielleicht können Sie zunächst die Compiler-Fehler lesen ... – Paco

+0

würde es tatsächlich einfacher für mich um Probleme mit dem echten Code zu identifizieren. Ihr Pseudocode sieht gut aus. – CoderDennis

Antwort

0

Ok, also die Introspektion in 2.0 ist schlecht, aber es hat sich in 3.5 verbessert. Also alles, was ich aber gab auf diese, bis ich mit GetType Herumspielen begann, und ich stolperte über dieses:

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 

Jetzt kann ich es nur nennen wie <%=Html.RenderSelect(Model)%> auf meiner Meinung nach, wenn ich dies wünschen. Dann, wenn das Unternehmen Modell Objekt nicht ‚id‘ oder ‚name‘ Attribute, kann ich angeben, sie mag:

<%=Html.RenderSelect(Model, "nameofvalue", "nameofdisplay")%> 
0

Was funktioniert nicht? Läuft Ihr Code? Generiert es eine Zeichenfolge?

Sie haben mindestens einen Tippfehler, der dazu führt, dass die generierte Zeichenfolge nicht in einem HTML-Formular funktioniert. Sollte <option value={0}>{1}</option>

Edit 2 sein: Um die IDictionary(Of Object, String) von Ihrem EF Objekte zu bekommen, würde ich Teilklassenimplementierungen schreiben, die eine GetSelectOptions Methode, um jedes Ihrer Objekte hinzuzufügen. Oder erstellen Sie eine Schnittstelle mit der Methode, die jedes Ihrer EF-Objekte implementiert. Dann rufen Sie einfach die RenderSelect Methode an und übergeben Sie EFObject.GetSelectOptions als SelectOptions Parameter.

Bearbeiten: Hier ist, wie ich das tun würde. Machen Sie Ihren Aufrufcode verantwortlich für das Lesen der Schlüssel/Wert-Paare von Ihrem EF-Objekt. Dann kann Ihre RenderSelect-Erweiterungsmethode viel sauberer sein. Sie möchten nicht, dass Ihre View-Helper-Methoden von der Struktur Ihrer Modellobjekte abhängig sind. Und Sie möchten sicherlich nicht, dass Ihre Hilfsmethode davon abhängt, dass Sie EF-Objekte verwenden.

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 
       [email protected] = "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 

Für einen kompletten Satz von überladenen Funktionen in Dropdownlist VB.NET, überprüfen Sie diese Datei aus dem vbmvc.codeplex.com Projekt aus, aus dem das obige Code kopiert und geändert wurde.

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

Dieser Code hat einen Rückgabetyp von XElement, aber nur result.ToString verwenden, um die String-Darstellung des Elements zu erhalten, wenn das ist, was Sie wollen.

+0

danke für das hinweisend. Vielleicht sollte ich klären ... – DrydenMaker

+0

toll, also das ist was ich machen möchte, aber ich habe kein Wörterbuch. Ich beginne tatsächlich mit einem Entity Framework-Objekt und möchte die Objekteigenschaften per String spezifizieren, so dass ich so etwas machen kann: <% = Html.RenderSelect ("SelectName", Element, "OptionValueProperty", "OptionTextProperty")%> – DrydenMaker

+0

Ich mag die Xhtml-Element-Methoden, aber wiederum erfordern sie alle, dass Sie ein Wörterbuch übergeben, das würde ich meine Objekte vorverarbeiten müssen. Das würde mich zurück zum Grundproblem bringen. Ich habe ein Objekt mit Eigenschaften und eine Zeichenfolge mit dem Namen der Eigenschaft, die ich möchte. Ist es in VB möglich, einen Wert vom Objekt zu erhalten? – DrydenMaker

0

Der ultimative Mangel, wenn VB scheint, ist es ist eine ausführliche Introspektion. Wenn Sie eine Zeichenfolge mit dem Namen einer Eigenschaft haben, gibt es keine gute Möglichkeit, den Wert dieser Eigenschaft für ein zufälliges Objekt abzurufen. Damit etwas funktioniert, muss jede Klasse berührt werden. Dennis Palmers Methode ist wahrscheinlich der beste Weg, generische Auswahlmöglichkeiten zu ermöglichen.

Also stelle ich die Frage: Wird das Entity Framework Team in zukünftigen Versionen etwas Nützliches darin einbauen?

Verwandte Themen