Свойства динамического объекта в помощнике MVC для объекта Entity Framework - PullRequest
1 голос
/ 20 июля 2009

Я новичок в vb9 и .NET MVC.Я хочу создать вспомогательную функцию MVC, для которой я передаю объект Entity Framework и заставляю его создавать выбор.В общем, я пробовал что-то вроде этого:

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

Однако это не работает.Было бы здорово иметь способ сделать это и передать текущий объект сущности.Типы данных меня избивают.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 29 июля 2009

Абсолютным недостатком, если кажется, что VB является его многословный самоанализ.Если у вас есть строка с именем свойства, то нет хорошего способа получить значение этого свойства для случайного объекта.Чтобы что-то сделать, нужно прикасаться к каждому классу.Метод Денниса Палмера, вероятно, является лучшим способом для создания общего выбора.

Поэтому я задаю вопрос: построит ли команда Entity Framework что-то полезное для этого в будущих версиях?

0 голосов
/ 15 августа 2009

Хорошо, так что самоанализ в 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)%> на мой взгляд, если я так хочу. Тогда, если объект модели сущности не имеет атрибутов 'id' или 'name', я могу указать их как:

<%=Html.RenderSelect(Model, "nameofvalue", "nameofdisplay")%>
0 голосов
/ 20 июля 2009

Что не работает? Ваш код работает? Это генерирует строку?

У вас есть хотя бы одна опечатка, из-за которой сгенерированная строка не будет работать в HTML-форме. Должно быть <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

Полный набор перегруженных функций DropDownList в VB.NET можно найти в этом файле из проекта vbmvc.codeplex.com, из которого был скопирован и изменен вышеуказанный код.

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

Этот код имеет тип возврата XElement, но просто используйте result.ToString, чтобы получить строковое представление элемента, если вы этого хотите.

...