Почему мой DisplayFor не проходит через мой IEnumerable <DateTime>? - PullRequest
18 голосов
/ 30 декабря 2011

У меня есть эта строка на мой взгляд

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))

, где m.DaysOfWeek - это IEnumerable<DateTime>.

Существует содержимое _CourseTableDayOfWeek.cshtml:

@model DateTime
@{
    ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
    <span class="dateString">Model.ToString("G")</span>
</th>

И я получаю следующую ошибку:

Элемент модели, переданный в словарь, имеет тип 'System.Collections.Generic.List`1[System.DateTime]', но для этого словаря требуется элемент модели типа 'System.DateTime'.

Если я ссылаюсь на следующий пост:

https://stackoverflow.com/a/5652524/277067

* * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * *1025* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1023* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '*' * * * DisplayFor »[*]. 1024 * Должен быть циклически повторять IEnumerable и отображать шаблон для каждого элемента, не так ли? *1025*

Ответы [ 4 ]

24 голосов
/ 30 декабря 2011

Это не зацикливание, потому что вы указали имя для отображаемого шаблона в качестве второго аргумента DisplayFor помощника (_CourseTableDayOfWeek).

Он зацикливается только тогда, когда вы полагаетесь на условные обозначения, т.е.

@Html.DisplayFor(m => m.DaysOfWeek)

, а затем внутри ~/Views/Shared/DisplayTemplates/DateTime.cshtml:

@model DateTime
@{
    ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
    <span class="dateString">Model.ToString("G")</span>
</th>

Как только вы укажете пользовательское имя для шаблона отображения (либо в качестве второго аргумента помощника DisplayFor, либо в качестве атрибута [UIHint]), он больше не будет зацикливаться для свойств коллекции, и шаблон просто будет передаваться IEnumerable<T> как модель ,

Это сбивает с толку, но это так. Мне это тоже не нравится.

0 голосов
/ 10 января 2019

Незначительный твик, позволяющий решению Дэна быть более общим:

public static class DisplayTextListExtension
    {
        public static MvcHtmlString DisplayForList<TModel, 
EModel>(this HtmlHelper<TModel> html, IEnumerable<EModel> model, string templateName)
        {
            var tempResult = new StringBuilder();

            foreach (var item in model)
            {
                tempResult.Append(html.DisplayFor(m => item, templateName));
            }

            return MvcHtmlString.Create(tempResult.ToString());
        }
    }
0 голосов
/ 07 октября 2014

Используйте FilterUIHint вместо обычного UIHint в свойстве IEnumerable<T>.

public class MyModel
{
    [FilterUIHint("_CourseTableDayOfWeek")]
    public IEnumerable<DateTime> DaysOfWeek { get; set; }
}

Больше ничего не нужно.

@Html.DisplayFor(m => m.DaysOfWeek)

Теперь отображается "_CourseTableDayOfWeek" EditorTemplate для каждого DateTime в DaysOfWeek.

0 голосов
/ 02 ноября 2013

Это похоже на ошибку. Классы Html Helper легко расширять, хотя, взглянув на исходный код MVC, разыскивая ошибку, я отказался и просто использовал предпосылку, что шаблоны работают для отдельного элемента, поэтому я написал расширение HtmlHelper, которое обернет его для вас. Я вынул лямбда-выражение для своей собственной простоты, но вы можете легко вернуться к этому. Этот пример только для списка строк.

    public static class DisplayTextListExtension
{
    public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName)
    {
        var tempResult = new StringBuilder();

        foreach (var item in model)
        {
            tempResult.Append(html.DisplayFor(m => item, templateName));
        }

        return MvcHtmlString.Create(tempResult.ToString());
    }
}

Тогда фактическое использование выглядит следующим образом:

                                @Html.DisplayForList(Model.Organizations, "infoBtn")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...