2012-03-28 10 views
9

... antes de todo, lo hago solo por curiosidad. Nada aplicación real aquí, pero para el conocimiento y retoques sobre ...¿Es ASP.net MVC View una "clase"?

ASP.NET Vistas tener propiedades como Model y ViewData e incluso tiene métodos también.

Incluso puede usar @Using como un archivo normal class.cs.

sé que es de tipo WebPageView<TModel>

Mi pregunta principal es: es una clase?

Debe ser porque es un tipo, pero ..

yo debería ser capaz de hacer esto, entonces también (motor de la maquinilla de afeitar):

@{ 
    public class Person 
    { 
     //etc... 
    } 

    var p = new Person(); 
} 

<span>@p.Name</span> 

Sin embargo, no puedo. . ¿por qué?

nota: actualmente un C#, principiante de ASP.net.

+1

[ahora está abierto] (http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx) por lo que ahora puede [averiguarlo directamente] (http://aspnetwebstack.codeplex.com/). –

+1

La respuesta técnica es que el código de vista se coloca en un cuerpo de método. Y no puedes poner clases allí. Pero, ¿por qué quieres definir clases dentro de una vista? Eso suena dudoso. – CodesInChaos

+0

@dtryon increíble !! gracias por la buena noticia :) –

Respuesta

5

No puede hacerlo porque la maquinilla de afeitar de marcado se compila en una secuencia de instrucciones dentro de un métododentro de la clase generada derivado de WebViewPage o WebViewPage <TModel>

La pregunta más importante sin embargo, es por eso te gustaría hacer esto? En su lugar, prefiera mantener Razor libre de este tipo de lógica: su trabajo debe ser producir diseño, no hacer ningún tipo de lógica comercial o transformación de datos empresariales. Realice todo el trabajo pesado en su método de acción y entregue un Modelo que describa los datos necesarios para representar el diseño en un formato que requiera solo un simple proceso de marcado Razor.

Hay bastantes tutoriales en una ronda que describen cómo acercarse a MVC y Razor. Desenterré esta que es breve pero hace un trabajo razonable al cubrir una historia de punta a punta que podría ayudarte a entender la idea. Incluye el uso de EF para obtener datos que podrían ser más de lo que estaba negociando, pero vale la pena leerlo para obtener una idea completa de cómo se funde una arquitectura completa: http://weblogs.asp.net/shijuvarghese/archive/2011/01/06/developing-web-apps-using-asp-net-mvc-3-razor-and-ef-code-first-part-1.aspx

5

Sí, las vistas son clases. Se compilan en un ensamblaje temporal (por lo que no tienen acceso a los miembros internos del ensamblaje principal, lo que es bueno saber cuando se trata de tipos dinámicos/anónimos).

Creo que Razor tiene una regla que no permite declarar clases internas, no se ha comprobado.

11

Claro, usted tiene que utilizar la palabra clave functions con el fin de bajar a la exposición de las cosas a nivel de clase como campos, propiedades, métodos y tipos interiores:

@functions { 
    public class Person 
    { 
     public string Name { get; set; } 
    } 
} 

@{ 
    var p = new Person(); 
} 

<span>@p.Name</span> 

Esto funciona muy bien.

Dicho esto, tenga en cuenta que el único propósito de estas clases internas es si necesita definir un tipo solo para usar dentro de una vista. Yo mismo, nunca he encontrado la necesidad de hacer esto para las clases.Sin embargo, he aprovechado esta técnica para agregar nuevos métodos que no son sintácticamente posibles con los métodos helper.

+0

¡Whoa! nunca antes se vio la palabra clave 'functions'. ¡Compila! gracias :) –

+4

@ JanCarloViray Por favor considere cambiar la respuesta seleccionada a esta. – CodeAngry

+1

@ JanCarloViray tenga en cuenta la sugerencia de CodeAngry. –

Cuestiones relacionadas