2012-06-13 5 views
9

Quiero crear una plantilla de visualización solo para propiedades de cadena y usar la configuración predeterminada para todas las demás.ASP.NET MVC 4 define la plantilla de visualización solo para cadena

Traté de hacer una string.cshtml en Vistas/shared/DisplayTemplates con los contenidos siguientes:

@model string 
@Html.TextBoxFor(m => m, new { @readonly = "readonly" }) 

ahora tengo un problema cuando intento abrir cualquier punto de vista que utiliza DisplayFor (m => m. propiedad), muestra un error como: El elemento del modelo pasado al diccionario es del tipo 'System.DateTime', pero este diccionario requiere un elemento de modelo de tipo 'System.String'. o: El elemento de modelo pasado al diccionario es del tipo 'System.Int64', pero este diccionario requiere un elemento de modelo de tipo 'System.String'.

Sé que puedo resolver esto agregando una plantilla de visualización para cada tipo utilizado, pero supongo que también es posible utilizar la plantilla "predeterminada" para todos los tipos donde no se define la plantilla personalizada.

ACTUALIZACIÓN Después de la respuesta de Darin, he comprobado Brad tutorial y de cambio de plantilla en:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" }) 

Esto se basa en la plantilla "por defecto" y funciona para todos los tipos.

Respuesta

12

Hay 9 plantillas de visualización incorporadas: "Boolean", "Decimal", "EmailAddress", "HiddenInput", "Html", "Object", "String", "Text" y "Url".

Eche un vistazo a following blog post que explica en detalle cómo funcionan las plantillas y cómo se resuelven. He aquí una cita de él:

Los siguientes nombres de plantilla son juzgados en orden:

  1. TemplateHint de ModelMetadata
  2. nombreDeTipoDeDatos de ModelMetadata
  3. El nombre del tipo (ver nota más abajo)
  4. Si el objeto no es complejo: "Cadena"
  5. Si el objeto es complejo y una interfaz: "Objeto"
  6. Si el objeto es complejo y no una interfaz: Recursividad a través de la hiearchy herencia para el tipo, tratando cada nombre de tipo

Así está el punto 4. emergente por fecha y hora y Int64 porque no hay plantilla predeterminada para esos tipos.

De modo que podría utilizar Indicaciones de plantilla o nombres de Tipo de datos de ModelMetadata para usar esta plantilla personalizada solo para propiedades determinadas en su modelo de vista.

+1

¿Puede decirme en qué parte del código fuente de mvc viven los archivos Object o Collection.cshtml? – Maslow

+1

@Maslow: no hay realmente archivos cshtml en el código fuente, html se genera con la ayuda de TagBuilder (por ejemplo, consulte http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/8b17c2c49f88#src/System.Web .Mvc/Html/InputExtensions.cs) –

Cuestiones relacionadas