2011-04-18 13 views
20

Tengo un par de propiedades en mi modelo de vista que son solo de visualización pero necesito recuperar sus valores usando jQuery para realizar un cálculo en la página. El método estándar Html.DisplayFor() solo escribe su valor en la página. Quiero crear una plantilla de afeitar que me permita representar cada elemento como:Cómo creo una plantilla MVC Razor para DisplayFor()

<span id="ElementsId">Element's value</span> 

Sé que puedo especificar una plantilla en Html.DisplayFor() utilizar una plantilla especial para que la propiedad, pero dentro de esa plantilla ¿cómo identifico el atributo id para escribir en la etiqueta span?

@Html.DisplayFor(model => model.Element, "MyTemplate"); 

Respuesta

45

OK, lo encontró y lo que en realidad es muy simple. En mis Vistas \ Shared \ DisplayTemplates carpeta tengo Reading.cshtml que contiene lo siguiente:

@model System.Int32 
<span id="@ViewData.ModelMetadata.PropertyName">@Model</span> 

Esto hace que la etiqueta correcta utilizando el nombre de la propiedad como el atributoID y el valor de la propiedad como los contenidos:

<span id="Reading">1234</span> 

En el archivo de vista esto puede ser llamado usando la siguiente:

@Html.DisplayFor(model => model.Reading, "Reading") 

O si la propiedad del modelo está decorado con UIHint ("lectura") entonces el nombre de la plantilla se puede dejar fuera de la convocatoria a DisplayFor() y todavía se hacen usando la plantilla:

@Html.DisplayFor(model => model.Reading) 

Esto debería funcionar igual de bien con las plantillas personalizadas del editor.

+0

Entonces, ¿cómo se maneja 'System.Int32?' (Nullable int). No puede hacer otra vista llamada 'Int32? .cshtml' –

+0

La vista se llama Reading.cshtml, no Int32.cshtml. Entonces, si tiene una propiedad 'Int32?', Crearía un nuevo archivo 'WhateverPropertyIsCalled.cshtml', con' @model System.Int32? '. Descargo de responsabilidad: no recuerdo haber tenido este requisito yo mismo y no he probado que esto funcione. –

+3

Realmente probé esto y si crea un archivo llamado 'Int32.cshtml' con un modelo de' System.Int32? 'Anulará la plantilla predeterminada y será recogido por ambas versiones de int32 (nullable y no admite nulos)) –

7

Se podría hacer de este id parte del modelo de vista y utilizarlo en la plantilla de visualización:

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span> 
1

Tuve exactamente el mismo problema que la publicación original.

No estoy seguro de que el último comentario sea válido. Haría que el atributo de identificación HTML sea un valor de tiempo de ejecución y, por lo tanto, no se puede referenciar con un nombre de tiempo de diseño.

he usado la sobrecarga de DisplayFor que le permite añadir nuevos objetos en el diccionario de datos (ViewBag)

Mi modelo es un objeto de C# llamado Proyecto con diversas propiedades. En mi opinión, tengo esto:

@Html.DisplayFor(model => model.ProjectName, "StringDisplaySetHtmlID", new { HtmlID = "project-name" }) 

Se trata de utilizar una plantilla personalizada llamada StringDisplaySetHtmlID y el último parámetro añade un valor par de claves para el Viewbag.

Mi archivo de plantilla se ve así:

@model string 
<span class = "display-field" id = "@(ViewBag.HtmlID)">@Model</span> 

También estoy estableciendo una clase aquí con fines de estilo.He usado el nombre clave HtmlID en lugar de solo ID para evitar una posible colisión de nombres común.

Ahora en mi javascript que puede recoger el contenido de la envergadura utilizando la siguiente jQuery:

var projectName = $('#project-name').text() 
2

Hay an article explicar la Templates (Display + Editor) en la maquinilla de afeitar, y también el atributo UIHint.

Cuestiones relacionadas