Как обнулить проверку @Html.DisplayNameFor с помощью IEnumerable — C# и ASP.NET MVC

Я не уверен, что ищу это неправильно, но я не могу определить, как null проверить @Html.DisplayNameFor.

У меня есть IEnumerable<model>, у которого есть model.Numbersmodel.Order и model.Time:

@Html.DisplayNameFor(Model => Model.Numbers)

и т.п.

Я пытался сделать это, но VS выдает ошибку:

@Html.DisplayNameFor(Model => Model?.Numbers)

Но я получаю это сообщение, когда я нахожусь над красной волнистой линией в VS:

An expression tree lambda may not contain a null propagating operator

Я также пробовал добавлять where() и @Html.DisplayNameFor(Model => Model.Numbers.Any()), но это не работает.

Мой код:

@model IEnumerable<BusinessLayer.NumbersModel>

...

<table class = "table table-sm">

    <thead class = "thead-dark">
        <tr>
            <th>@Html.DisplayNameFor(Model => Model.Numbers)</th>
            <th>@Html.DisplayNameFor(Model => Model.Order)</th>
            <th>@Html.DisplayNameFor(Model => Model.Time)</th>
        </tr>
    </thead>

    @foreach (var item in Model)
    {
        if (item.Numbers != null && item.Order != null && item.Time != null)
        {
            <tr>
                <td>@Html.DisplayFor(m => item.Numbers)</td>
                <td>@Html.DisplayFor(m => item.Order)</td>
                <td>@Html.DisplayFor(m => item.Time)</td>
                <td><i class = "m-icon--edit"></i> @Html.ActionLink("Edit", "Edit", new { id = item.ID }, new { @class = "m-numbers__link" })</td>
                <td>
                    @using (Html.BeginForm("Delete", "Numbers", new { id = item.ID }))
                    {
                        <i class = "m-icon--delete"></i> <input type = "submit" value = "Bin" onclick = "return confirm('You are about to delete this record');" />
                    }
                </td>
            </tr>
        }
    }
</table>

Модель:

public class NumbersModel
{
    public int ID { get; set; }
    public string Numbers { get; set; }
    public string Order { get; set; }
    public string Time { get; set; }
}

Какую ошибку вы получаете?

Suresh 02.06.2019 18:11
An expression tree lambda may not contain a null propagating operator. — это то, что я получаю, когда навожу курсор на красную волнистую линию в VS с помощью ?
user1574598 02.06.2019 18:12

Вы можете прочитать принятый ответ для этого вопрос

Suresh 02.06.2019 18:15

Если ваш @model — это IEnumerable<model>, то, конечно же, вы не можете называть .Numbers и т. д. по этому поводу. Вероятно, у вас есть цикл на странице, который перечисляет Model, и это переменная цикла, которую вы передаете лямбде.

GSerg 02.06.2019 18:17

У меня есть цикл после трехкратного вызова DisplayNameFor, который перебирает модели и отображает данные через DisplayFor

user1574598 02.06.2019 18:19

Это не имеет смысла. Можете ли вы показать эту часть представления, включая пункт @model?

GSerg 02.06.2019 18:21

Да, сейчас я отредактирую свой вопрос.

user1574598 02.06.2019 18:22

Я все еще не уверен, но, похоже, вы хотите что-то вроде DisplayNameFor(m => m.First().Numbers).

GSerg 02.06.2019 18:25

что такое тип Model.Numbers?

Ahmed Yousif 02.06.2019 18:29

1) Пожалуйста, объясните, чего вы ожидаете от этого кода: DisplayNameFor(Model => Model.Numbers) 2) Пожалуйста, покажите нам класс для вашей модели.

CodingYoshi 02.06.2019 18:29

Я снова отредактирую свой вопрос - все они строки.

user1574598 02.06.2019 18:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
557
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш @model — IEnumerable<T>. У него нет .Numbers или .Order, есть у содержащихся в нем объектов.

DisplayNameFor() нужно только знать тип выражения, из которого можно получить атрибут DisplayAttribute. Выражение, которое вы передаете ему, не должно вычисляться для ненулевого экземпляра объекта, оно не будет выполняться для его результата.

Так

<thead class = "thead-dark">
    <tr>
        <th>@Html.DisplayNameFor(m => m.First().Numbers)</th>
        <th>@Html.DisplayNameFor(m => m.First().Order)</th>
        <th>@Html.DisplayNameFor(m => m.First().Time)</th>
    </tr>
</thead>

Это будет работать, даже если .Numbers равно нулю, или .First() равно нулю, или весь Model равен нулю.

Обычно вам не нужно обрабатывать пустые значения при передаче деревьев выражений помощникам ASP.NET MVC.

Другие вопросы по теме