2011-01-18 2 views
1

Я работаю над веб-сайтом ASP.NET MVC2. Для учебы. Я работаю с языком Visual Basic.Пользовательский ASP.NET MVC2 HtmlHelper: как получить экземпляр переданного объекта?

В свете я хотел бы сделать это:

<%: Html.EditorForEnumeracion(Function(v) v.combustible%> 

Итак, я создал метод расширения HtmlHelper:

Imports System.Runtime.CompilerServices 
Imports System.Linq.Expressions 
Imports System.Reflection 

Public Module HtmlHelpers 
    <Extension()> _ 
    Public Function EditorForEnumeracion(Of TModel, TValue)(ByVal html As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of TModel, TValue))) As MvcHtmlString 
     'My stuff goes here 
    End Function 
End Module 

Проблема заключается в том, что я не знаю, как получить экземпляр объекта vbulbustability, который я передаю помощнику. Меня не интересует объект v. Мне нужно работать с горючим атрибутом объекта v.

Here и here похоже, как это сделать, но я не понимаю. Кроме того, я работаю с Visual Basic, а не с C#.

Я думаю, что я могу получить экземпляр объекта Enumeracion через параметр выражения, но я не понимаю, как это сделать.

Подробнее.

Это мой "Vehiculo" класс:

Namespace Models.Automovil 
    Public Class Vehiculo 
     Public Property tipo As New Models.Enumeracion("TipoDeVehiculo") 
     Public Property marca As String 
     Public Property modelo As String 
     Public Property numeroDePuertas As Integer 
     Public Property combustible As New Models.Enumeracion("TipoDeCombustible") 
     Public Property potencia As Integer 
     Public Property fechaPrimeraMatriculacion As DateTime 
     Public Property version As String 
     Public Property precio As Decimal 
     Public Property descripcion As String 
    End Class 
End Namespace 

А это мой "Enumeracion" Класс:

Namespace Models 
    Public Class Enumeracion 
     Private bd As New tarificadorasegasaEntities 
     Private diccionario As New Dictionary(Of String, Integer) 
     Private _nombre As String 
     Private _clave As String 
     Private _valor As Integer 
     Public ReadOnly Property nombre As String 
      Get 
       Return _nombre 
      End Get 
     End Property 
     Public ReadOnly Property clave As String 
      Get 
       Return _clave 
      End Get 
     End Property 
     Public ReadOnly Property valor As Integer 
      Get 
       Return _valor 
      End Get 
     End Property 

     'More stuff here. Methods. 

    End Class 
End Namespace 

Модель класса Vehiculo.

По-прежнему не разрешается это.

Заранее спасибо.

ответ

0

Попробуйте так:

<Extension()> _ 
Public Function EditorForMyCustomClassB(Of Vehiculo, Enumeracion)(ByVal html As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of Vehiculo, Enumeracion))) As MvcHtmlString 
    Dim res = ModelMetadata.FromLambdaExpression(expression, html.ViewData) 
    Dim e As Enumeracion = DirectCast(res.Model, Enumeracion) 
    ' use e here 
End Function 
+0

res.Model ничего, поэтому e тоже ничего. – Daniel

+0

@ Daniel, если res.Model ничего, это означает, что ваш взгляд не сильно типизирован или вы не передали ему какую-либо модель из действия вашего контроллера. –

+0

Вы были правы. Большое спасибо. – Daniel

1

Вы должны скомпилировать выражение в Func(Of TModel, TValue), а затем вызвать его на модели:

Dim func = expression.Compile() 
Dim value = func(html.ViewData.Model) 
+0

Я получил NullFeferenceException когда FUNC (html.ViewData.Model). Ты знаешь почему? Спасибо за ваше время. – Daniel

+0

Какая у вас модель? – SLaks

+0

Модель - мой класс vehicleulo. – Daniel

Смежные вопросы