2009-01-28 13 views
5

En RC1, se modificó el comportamiento de la plantilla para crear una vista.Cómo obtener un archivo 'codebehind' para crear una vista ASP.NET-MVC en RC1 de forma predeterminada

Según lo explicado por la publicación de Scott Gu sobre el release candidate, una vista de aspx recién creada ya no tiene un archivo de código subyacente.

base en la retroalimentación que hemos cambiado vista-plantillas para no tener un archivo de código subyacente por defecto. Este cambio ayuda a reforzar el propósito de vistas en una aplicación MVC (que se pretenden ser puramente sobre la prestación ya no contiene ningún no-renderizado código relacionado) archivos, y para la mayoría de la gente elimina sin utilizar en el proyecto .

La compilación de RC ahora agrega la sintaxis de C# y VB para heredar plantillas de vista de clases base que usan genéricos. Por ejemplo, a continuación estamos utilizando este con la plantilla de vista Edit.aspx - cuyo “hereda” atributo se deriva del tipo ViewPage:

me gusta ser capaz de escribir código específico vista en el código subyacente solo para mostrar la vista, especialmente si repito la lógica en varias partes de la página donde no puedo justificar la creación de una vista parcial.

Mi pregunta real: Scott dijo por defecto - lo que implica que puedo cambiar ese comportamiento, pero me parece que no puede ver dónde. ¿Es posible? Crear manualmente un archivo de código subyacente y cambiar las cosas es un problema.

Esto provoca un problema adicional también:

  • Si refactorizar el nombre de mi modelo a continuación, la directiva en la vista no se actualiza. Este no es el fin del mundo, sino una clara ventaja de tenerlo totalmente tipado.

Adición: Para aquellos que se preguntan qué querría un código subyacente aquí son algunas de las posibles razones. Esta es una lista acumulativa de casi todo lo que he pensado. No hace falta decir (así debería ser) que no debe acceder a ningún dato que no sea el que ya está en el modelo. LINQ estaría bien para la manipulación simple de los datos del modelo, ¡pero LINQ to SQL NO lo haría! MVC es para personas que ya deberían saber esto - por eso me encanta - hecho POR personas inteligentes PARA personas inteligentes.

  • Controles heredados de ASP.NET de enlace de datos: si una alternativa no está disponible o si se necesita una solución temporal.
  • Ver la lógica que requiere recursión para crear algún tipo de HTML anidado o jerárquico.
  • Ver la lógica que usa variables temporales. ¡Me niego a definir las variables locales en mi sopa de etiquetas! Me gustaría tenerlos como propiedades en la clase de vista como mínimo.
  • Lógica que es específica solo para una vista o modelo y no pertenece a un HtmlHelper. Como nota al margen, no creo que un HtmlHelper deba saber sobre ninguna clase 'Modelo'.Está bien si conoce las clases definidas dentro de un modelo (como IEnumerable<Product>, pero no creo, por ejemplo, que deba tener un HtmlHelper que tome ProductModel.
  • Los métodos HtmlHelper terminan siendo visibles desde TODAS sus vistas cuando escribe Html+dot y realmente quiero minimizar esta lista tanto como sea posible.
  • ¿Qué pasa si quiero escribir el código que usa HtmlGenericControl y otras clases en ese espacio de nombres para generar mi HTML de una manera orientada a objetos (o tengo un código existente que lo hace que quiero exportar)
  • Qué sucede si planeo usar un motor de visualización diferente en el futuro. Es posible que desee mantener algo de lógica aparte de la sopa de etiquetas para que sea más fácil volver a utilizarla más tarde.
  • ¿Qué pasa si quiero poder cambiar el nombre de mis clases de modelo y hacer que refactorice automáticamente mi vista sin tener que ir a view.aspx y cambiar el nombre de clase?
  • ¿Qué pasa si estoy coordinando con un diseñador de HTML en quien no confío para no estropear la 'sopa de etiquetas' y quiero escribir algo más allá del bucle básico en el archivo .aspx.cs.

creo que la gente está sesgada en contra 'de código subyacente', ya que traditially se ha interpretado en el sentido de 'evento código de manejo' en lugar de 'la otra mitad de la clase parcial de una vista', que es lo que es.

Code-behind for views está bien.

No estoy en desacuerdo con que desordene un poco la estructura de carpetas, pero para eso está el icono +. Solo quiero la posibilidad de crear una vista con código detrás usando 'Agregar vista'.

+0

¿Cuál fue su conclusión? - ¿Es posible agregar una clase de código subyacente? –

Respuesta

2

Para responder a su pregunta directamente, no creo que pueda cambiar este valor predeterminado. Podría intentar modificar la plantilla (que estaría en algún lugar en% programfiles% \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ ItemTemplates "), pero no estoy seguro.

Sin embargo, la" ruta MVC " para este escenario es, probablemente, para crear un ayudante de encargo, en una clase separada.

Hace poco escribí una aplicación web que utiliza Gravatar (http://www.gravatar.com) para generar imágenes de perfil y seguí escribiendo la misma costumbre <img> etiquetas en todo mi vistas, así que creé un helper: Html.Gravatar()

Solo cree una clase estática "MyHelpers" o "GravatarHelpers" o "FooHelpers" y agregue métodos de extensión estáticos con las firmas de este tipo:

public static string Gravatar(this HtmlHelper htmlHelper, string emailAddress) { 
    return htmlHelper.Image(...); 
} 

o, si utiliza vistas inflexible de tipos (ViewPage <T>) y quiere tomar ventaja de que puede extender HtmlHelper <T>

public static string Foo<TModel>(this HtmlHelper<TModel> htmlHelper, ...) { 
    // Do stuff 
    return // Stuff 
} 

Usted puede fácilmente cambie HtmlHelper por UrlHelper o AjaxHelper. Creo que también puede acceder a ViewData, etc. desde una propiedad ViewContext en el helper.

+0

si es genérico, definitivamente un ayudante es el camino a seguir. pero, ¿y si estoy escribiendo algo que requiera, por ejemplo, recursividad o lógica compleja que no quiero en mi opinión? –

+0

Probablemente aún use un ayudante, incluso si solo fuera a usarse varias veces en una sola vista.Simplemente cree una clase de ayudantes para esa vista: "NewCustomerViewHelpers", en el mismo espacio de nombres que la vista para que no entre en conflicto con otros ayudantes de visualización. Eso es prácticamente un archivo de código subyacente :) –

2

Eso realmente no parece una gran idea. Todos los comentarios que he leído dicen "no utilices el código subyacente, deseamos que no esté allí". Y estoy de acuerdo. Podría intentar escribir su lógica en métodos de extensión (tradicionalmente en HtmlHelper) como here.

+0

cada comentario que he escuchado (sobre todo podcasts) dice 'tenga cuidado de no poner la lógica que no se ve allí'. MVC está destinado a personas que saben lo que están haciendo. si eres lo suficientemente estúpido como para poner LINQ en tu Vista, entonces es tu culpa. hay mucha lógica VIEW que tiene mucho sentido entrar en view.cs –

+0

@Simon; Sospecho que tendremos que estar de acuerdo para estar en desacuerdo sobre eso ... –

+0

@marc incluso con mi apéndice anterior ;-) tal vez concedo que el nuevo valor predeterminado debe seguir siendo el nuevo valor predeterminado - me gustaría que fuera hecho más fácil para cada persona/arquitecto para poder elegir –

0

También me gustaría tener códigos subyacentes por defecto, pero no puedo encontrar la manera de cambiarlo.Esta página explica cómo agregar un código detrás de una página: http://msdn.microsoft.com/en-us/magazine/cc301556.aspx.

En mi opinión, las clases de código subyacente son ideales para los controles de enlace de datos y hacer algunos cambios menores en los datos en caso de que sea necesario (por ejemplo, formato de fecha y moneda). También repetidores son, con mucho, la forma más sencilla de mostrar listas de datos, todavía no puedo encontrar una manera de iterar a través de una colección de tipo anónimo, y sólo tener una instrucción en una página me recuerda a PHP: S

+0

diría que el formato de fecha y moneda pertenece a alguna otra biblioteca de utilidades (siempre que esté haciendo un formateo especial, tal vez según las preferencias del usuario). No pertenece realmente al 'código subyacente' y definitivamente no a HtmlHelper (a menos que estés generando una verdadera representación HTML de una fecha) –

0

respondí esta pregunta here:

cómo agregar una página de código subyacente a una vista parcial

parece que esto no era particularmente difícil, y es bastante factible esta respuesta trabajó para un parcial 'ViewUserControl' pero el lo mismo debe aplicarse

Ok.

Primero: Añadir un archivo de clase con la convención de Cs (es decir view.ascx.cs)

Segundo: Añadir "usando System.Web.Mvc;" a la clase

Tercero: cambiar la clase de heredar de "ViewUserControl <>"

Cuarto: Añadir lo siguiente a la cabecera de la Vista:

CodeBehind="View.ascx.cs" Inherits="Project.Views.Shared.View" 

En quinto lugar: Copiar los archivos de la solución y arrastre de nuevo a volver a asociar los dos juntos

Nota: para que esto funcione con una normal MVC Ver sólo tiene que heredar la clase de "ViewPage"

1

Soy de la opinión de que el código detrás de los archivos todavía es útil. Si bien muchas personas hablan de que son malas porque proporcionan un método para romper el patrón de diseño que MVC busca, no lo hacen inherentemente. Puede decir que se supone que la vista es estúpida, pero creo que es más exacto decir que no se supone que la vista se preocupe por la lógica empresarial compleja. Sin embargo, debe preocuparse por los aspectos de la presentación. Como tal, todavía hay elementos para presentar información que requiere código más allá de simple html. Sigue el razonamiento de la separación de las preocupaciones (y mucho menos, la legibilidad pura de la vista) que el marcado se preocupa por el marcado con el código detrás de apoyarlo cuando el código es necesario.

Luis Abreu ha escrito un buen artículo sobre el tema

Codebehind files in asp.net mvc are not evil

1

FYI - En Visual Studio 2010, simplemente añadiendo el archivo de código apropiado nombre del archivo que contiene la vista asociará automáticamente el nuevo código- detrás del archivo con la vista. No necesita eliminar y volver a agregar los archivos para que se vinculen. Sin embargo, igual deberá cambiar las clases heredadas para que funcionen como describe @Harry.

+0

eso es bueno :) ¡las cosas solían ponerse en un verdadero lío a veces cuando se confundían! –

Cuestiones relacionadas