Как обнулить проверку @ Html.DisplayNameFor с IEnumerable - C # & ASP.NET MVC - PullRequest
1 голос
/ 02 июня 2019

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

У меня есть IEnumerable<model>, который имеетmodel.Numbers model.Order и model.Time:

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

и т. д.

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

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

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

Лямбда дерева выражений может не содержать нуль-распространяющий оператор

Я также пытался добавить 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; }
}

1 Ответ

2 голосов
/ 02 июня 2019

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

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

So

<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.

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