Estoy esperando que esto es bastante simple, aunque después de mucho Googlear, no he sido capaz de resolverlo.

Estoy trabajando en un sitio de carrito de compra con MVC 3, y el uso de código primero de Entity Framework. El modelo que yo voy a enviar sobre una lista de Productos de los objetos, y cada uno de los objetos que 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 DisplayFormat atributo podría causar la línea siguiente en la vista para dar formato al valor de una moneda (elemento es el producto objeto en el bucle):

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

Pero esto no se aplica el formato a todos. Hasta ahora la única manera en la que he sido capaz de llegar al trabajo es el uso de este lugar:

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

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

Cualquier información sobre este sería el más apreciado!

ACTUALIZACIÓN

Darin respondió y señaló que funciona, que me hizo volver sobre lo que realmente estaba enviando a la vista. Me di cuenta de que aunque tengo una clase llamada ProductModel, que tiene la DisplayFormat atributo, en realidad estaba volviendo otro modelo que contiene una lista de productos. Esto se llama ProductListModel y me di cuenta de que devuelve una lista de los datos del Producto, de la clase – no la ProductModel clase!

Así que al final fue realmente muy simple. Sólo deseo que no me había perdido una media de la tarde. Gracias por inspirarme para volver atrás y comprobar correctamente, Darin!

OriginalEl autor Matt Winward | 2011-09-05

2 Comentarios

  1. 16

    Pero esto no se aplica el formato a todos.

    Oh, tienes que estar haciendo algo muy malo como el DisplayFormat atributo que debe trabajar. 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);
        }
    }

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

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

    Al ejecutar esta aplicación puedo conseguir, totalmente esperado, $0.56.

    Entonces, ¿qué da? ¿Cómo es tu situación difiere de la mía?

    Tienes razón Darin. Era tarde en el día y yo estaba haciendo el estúpido error de pensar que me estaba mostrando una cosa cuando en realidad me estaba mostrando otra! Voy a actualizar mi post. Gracias por demostrar que funciona, aunque!
    sólo [DataType(DataType.Currency)] es suficiente. usted incluso no necesita la DisplayFormat

    OriginalEl autor Darin Dimitrov

  2. 0

    Una opción es crear un Currency.cshtml DisplayTemplate y quitar el DisplayFormat atributo. A continuación, en su Currency.cshtml usted podría dar formato como más te guste.

    Como parte de las plantillas de proceso, DataType se utiliza para seleccionar una plantilla.

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

    OriginalEl autor Erik Funkenbusch

Dejar respuesta

Please enter your comment!
Please enter your name here