В MVC 3 я не могу заставить @ Html.DisplayFor отобразить отформатированную строку - PullRequest
12 голосов
/ 06 сентября 2011

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

Я работаю над сайтом корзины покупок с 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, поскольку он предназначен для обработки таких вещей, как нули. Я знаю, что это будет 0 или больше. На самом деле с проверкой это всегда будет какая-то сумма, но я хочу убедиться, что нет более правильного способа сделать это, прежде чем я продолжу.

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

UPDATE

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

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

Ответы [ 2 ]

16 голосов
/ 06 сентября 2011

Но форматирование вообще не применяется.

О, вы должны делать что-то очень неправильное, так как атрибут 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.

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

0 голосов
/ 06 сентября 2011

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

Как часть процесса шаблонирования, DataType используется для выбора шаблона.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...