Подтвердить что ты не робот

В MVC 3 я не могу получить @Html.DisplayFor для отформатированной строки

Я надеюсь, что это довольно просто, хотя после многих проблем в Googling я не смог его обработать.

Я работаю над сайтом корзины покупок с MVC 3 и с использованием первого кода Entity Framework. Модель, которую я отправляю, представляет собой список объектов Product, и каждый из этих объектов включает это свойство:

[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; }

Я надеялся, что атрибут DisplayFormat заставит следующую строку в представлении форматировать значение как валюту (элемент - это объект продукта в цикле):

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

Но это совсем не относится к форматированию. Пока единственным способом, которым я смог заставить его работать, является использование этого вместо этого:

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

Но если это возможно, я предпочел бы использовать @Html.DisplayFor, поскольку он предназначен для обработки таких вещей, как null. Я знаю, что это будет 0 или больше. На самом деле с проверкой всегда будет какая-то сумма, но я хочу убедиться, что раньше не было правильного способа сделать это, прежде чем я продолжу.

Любая информация об этом будет оценена наиболее высоко!

UPDATE

Дарин ответил и указал, что он работает, что заставило меня вернуться к тому, что я действительно отправлял на эту точку зрения. Я понял, что хотя у меня есть класс ProductModel, который имеет атрибут DisplayFormat, я фактически возвращал еще одну модель, содержащую список продуктов. Это называется ProductListModel, и я понял, что он вернул список класса Data Product, а не класс ProductModel!

Итак, в конце концов, это было очень просто. Мне жаль, что я не потратил впустую полдня на это. Спасибо, что вдохновили меня вернуться и проверить правильно, Дарин!

4b9b3361

Ответ 1

Но это совсем не относится к форматированию.

О, вы должны делать что-то очень не так, поскольку атрибут DisplayFormat должен работать. Например:

Модель:

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; }
}

Контроллер:

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

Вид (~/Views/Home/Index.cshtml):

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

Когда я запускаю это приложение, я получаю, как и ожидалось, $0.56.

Итак, что дает? Как ваш сценарий отличается от моего?

Ответ 2

Один из вариантов - создать Currency.cshtml DisplayTemplate и удалить атрибут DisplayFormat. Затем в вашем Currency.cshtml вы отформатируете его, как вам нравится.

В рамках процесса шаблонирования DataType используется для выбора шаблона.

Однако, как говорит Дарин, это должно работать без этого. У вас уже есть файл Currency.cshtml в вашем DisplayTemplates, который не применяет форматирование?