12

Espero que esto sea bastante simple, aunque después de mucha búsqueda en Google, no he podido resolverlo.En MVC 3, no puedo obtener @ Html.DisplayFor para representar una cadena formateada

Estoy trabajando en un sitio de carrito de compras con MVC 3 y utilizando Entity Framework con código primero. El modelo que estoy enviando más de una lista de objetos de producto, y cada uno de esos objetos incluye esta propiedad:

[Required(ErrorMessage = "This is a required field.")] 
[DataType(DataType.Currency)] 
[Range(1.00, 500.00, ErrorMessage = "Products can not be free.")] 
[DisplayFormat(DataFormatString = "{0:C}")] 
[DisplayName("Price")] 
public double Price { get; set; } 

Tenía la esperanza de que el atributo formatSalida causaría la siguiente línea en la vista para dar formato al valor una moneda (artículo es el producto objeto en el bucle):

@Html.DisplayFor(modelItem => item.Price) 

Pero esto no aplica el formato en absoluto. Hasta ahora, la única forma que he sido capaz de conseguir que funcione es utilizar esto en su lugar:

@String.Format("{0:C}", item.Price) 

Pero si es posible, prefiero usar @ Html.DisplayFor, ya que está diseñado para manejar cosas como los nulos . Sé que va a ser 0 o más. De hecho, con la validación siempre habrá una cierta cantidad, pero quiero asegurarme de que no haya una manera más correcta de hacerlo antes de continuar.

¡Cualquier información sobre esto sería muy apreciada!

ACTUALIZACIÓN

Darin respondió y señaló que lo hace el trabajo, lo que me hizo ir hacia atrás sobre lo que era en realidad el envío de más a la vista. Me di cuenta de que, aunque tengo una clase llamada ProductModel, que tiene el atributo DisplayFormat, en realidad estaba devolviendo otro modelo que contiene una lista de productos. Esto se llama ProductListModel y me di cuenta de que devolvía una lista de la clase de datos del producto, ¡no la clase ProductModel!

Así que, al final, en realidad fue muy simple. Solo desearía no haber perdido media noche en eso. Gracias por inspirarme a volver atrás y verificar correctamente, Darin!

Respuesta

16

Pero esto no aplica el formato en absoluto.

Oh, tienes que estar haciendo algo muy malo ya que el atributo DisplayFormat debería funcionar.Por ejemplo:

Modelo:

public class MyViewModel 
{ 
    [Required(ErrorMessage = "This is a required field.")] 
    [DataType(DataType.Currency)] 
    [Range(1.00, 500.00, ErrorMessage = "Products can not be free.")] 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    [DisplayName("Price")] 
    public double Price { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Price = 0.56 
     }; 
     return View(model); 
    } 
} 

Ver (~/Views/Home/Index.cshtml):

@model MyViewModel 
@Html.DisplayFor(x => x.Price) 

Cuando ejecuto esta aplicación consigo, como totalmente esperada, $0.56 .

¿Qué ofrece? ¿En qué difiere tu situación de la mía?

+1

Tienes razón, Darin. ¡Era tarde en el día y estaba cometiendo el estúpido error de pensar que estaba mostrando una cosa cuando en realidad estaba mostrando otra! Actualizaré mi publicación. ¡Gracias por probar que sí funciona! –

+3

simplemente '[DataType (DataType.Currency)]' es suficiente. ni siquiera necesita el DisplayFormat –

0

Una opción es crear un Currency.cshtmlDisplayTemplate y eliminar el atributo DisplayFormat. Luego, en su Currency.cshtml lo formatearía como prefiera.

Como parte del proceso de creación de plantillas, DataType se utiliza para seleccionar una plantilla.

Sin embargo, como dice Darin, esto debería funcionar sin hacer esto. ¿Alguna vez, ya tiene un archivo Currency.cshtml en su DisplayTemplates que no aplica formato?

Cuestiones relacionadas