2011-10-20 8 views
38

¿Puede señalar MVC a una carpeta que no sea la predeterminada (Views/Shared/EditorTemplates & Views/Shared/DisplayTemplates)? Me gustaría ponerlos en subcarpetas debajo de esos, o en otras carpetas fuera de la carpeta compartida.Plantilla MVC de una carpeta distinta de la predeterminada (EditorTemplates/DisplayTemplates)?

Por ejemplo, si tengo un editor de plantillas en esta carpeta:

~\Views\Order\ProductModel.cshtml

¿Cómo puedo saber mi plantilla EditorFor utilizar este nombre tempalte?

Traté de calificar completamente, pero esto no funciona:

@Html.EditorFor(m => m.ProductModel, @"~\Views\Order\ProductModel.cshtml") 

He intentado usar barras diagonales & barras invertidas, con/sin .chstml, todas las combinaciones que se me ocurre. Estoy empezando a pensar que esto no es compatible, pero no puedo imaginar por qué no lo será.

Respuesta

47

No, me temo que no puedes hacer esto.

For example, if I have an editor template under this folder

Ya no es una plantilla de editor. Es un parcial. Si desea compartir plantillas de editor entre diferentes controladores, simplemente puede ponerlos dentro de la carpeta ~/Views/Shared/EditorTemplates.

En lo que se refiere subcarpetas entonces se podría hacer esto:

@Html.EditorFor(x => x.Foo, "Order/ProductModel") 

cual hará que la plantilla ~/Views/CurrentController/EditorTemplates/Order/ProductModel.cshtml o ~/Views/Shared/EditorTemplates/Order/ProductModel.cshtml editor.

+6

Esto tiene sentido. No sabía que podría tener carpetas Editor/DisplayTemplate debajo de la carpeta de visualización del controlador. Eso logra lo que intento hacer. Gracias Darin. –

+0

La segunda ruta: '~/Views/Shared/EditorTemplates/Order/ProductModel.cshtml' no se encuentra para mí ... ¿hay algún problema? – Dmitry

+0

En realidad lo encuentra, pero me da un error: 'El elemento del modelo pasado al diccionario es del tipo 'System.Collections.Generic.List''1 [Whatever.Models.ProductModel]', pero este diccionario requiere un elemento de modelo de tipo 'Whatever.Models.ProductModel'. – Dmitry

3

Si hace esto:

@Html.EditorFor(x => x.Foo, "Order/ProductModel") 

no va a analizar Foo como una colección y aplicar el editor de plantillas para cada elemento. Más bien asumirá que su plantilla de editor debe aplicarse a la colección como un todo.

Si desea aplicar editor de plantillas para cada elemento individualmente, a colocarlo en la carpeta EditorTemplates en su carpeta de vista (ya que tendrá precedencia) y el uso de la sintaxis por defecto:

@Html.EditorFor(x => x.Foo) 

Por supuesto, el El nombre de la plantilla del editor debe coincidir con el tipo de elementos en su colección.

4

Pregunta anterior, pero ... la forma correcta de agregar una plantilla de pantalla/editor para un controlador específico es agregarla en la subcarpeta DisplayTemplates o EditorTemplates.

Suponiendo que, en su ejemplo, usted tiene OrderController, usted puede poner simplemente plantilla de visualización para su modelo en sub-carpeta, así:

~\Views\Order\DisplayTemplates\ProductModel.cshtml 

Luego, llame plantilla de visualización normalmente desde su punto de vista (por ejemplo, : from `~ \ Views \ Order \ Index.cshtml):

@Html.DisplayFor(m => m.MyProductModelProperty) 
+1

Esta respuesta aborda mejor el problema de tener plantillas de Editor/Pantalla cuando no tienen sentido que se compartan, sino que se contienen dentro de un controlador determinado. s evita intentar reutilizar lo que a veces no se puede reutilizar por el mantenimiento. Un voto para esta respuesta. –

Cuestiones relacionadas