@ Html.DisplayNameForModel () не работает, когда свойство обнуляется - PullRequest
0 голосов
/ 21 мая 2019

Если вы создаете базовую модель с свойством DateTime?(обнуляемый) при использовании DisplayNameForModel или LabelForModel будет отображаться пустой

с использованием примера приложения DotNet Core 2.2

Index.cshtml

*1007*
@model IndexPage
@{
    ViewData["Title"] = "Index";
}
<style>
    li > div, label { border: solid 1px black; padding: 0.1em; margin: 0.25em; }
    label { border-color: grey; }
    li > div:first-child:before { content: 'LabelFor: '; }
    li > div:nth-child(2):before { content: 'NameFor: '; }
    li > div:nth-child(3):before { content: 'DisplayFor: '; }
    li.editor > div:nth-child(3):before { content: 'EditorFor: '; }
</style>
<h1>Index</h1>
<ol>
    <li>
        <div>@Html.DisplayNameFor(m => m.DateTimeNonNullable)</div>
        <div>@Html.NameFor(m => m.DateTimeNonNullable)</div>
        <div>@Html.DisplayFor(m => m.DateTimeNonNullable)</div>
    </li>
    <li>
        <div>@Html.DisplayNameFor(m => m.DateTimeNullable)</div>
        <div>@Html.NameFor(m => m.DateTimeNullable)</div>
        <div>@Html.DisplayFor(m => m.DateTimeNullable)</div>
    </li>
    <li>
        <div>@Html.DisplayNameFor(m => m.DateTimeNullableWithDisplay)</div>
        <div>@Html.NameFor(m => m.DateTimeNullableWithDisplay)</div>
        <div>@Html.DisplayFor(m => m.DateTimeNullableWithDisplay)</div>
    </li>
    <li>
        <div>@Html.DisplayNameFor(m => m.DateTimeNullableWithDisplayName)</div>
        <div>@Html.NameFor(m => m.DateTimeNullableWithDisplayName)</div>
        <div>@Html.DisplayFor(m => m.DateTimeNullableWithDisplayName)</div>
    </li>
    <li class="editor">
        <div>@Html.DisplayNameFor(m => m.DateTimeNonNullable)</div>
        <div>@Html.NameFor(m => m.DateTimeNonNullable)</div>
        <div>@Html.EditorFor(m => m.DateTimeNonNullable)</div>
    </li>
    <li class="editor">
        <div>@Html.DisplayNameFor(m => m.DateTimeNullable)</div>
        <div>@Html.NameFor(m => m.DateTimeNullable)</div>
        <div>@Html.EditorFor(m => m.DateTimeNullable)</div>
    </li>
    <li class="editor">
        <div>@Html.DisplayNameFor(m => m.DateTimeNullableWithDisplay)</div>
        <div>@Html.NameFor(m => m.DateTimeNullableWithDisplay)</div>
        <div>@Html.EditorFor(m => m.DateTimeNullableWithDisplay)</div>
    </li>
    <li class="editor">
        <div>@Html.DisplayNameFor(m => m.DateTimeNullableWithDisplayName)</div>
        <div>@Html.NameFor(m => m.DateTimeNullableWithDisplayName)</div>
        <div>@Html.EditorFor(m => m.DateTimeNullableWithDisplayName)</div>
    </li>
</ol>

IndexPage.cs

    public class IndexPage
    {
        public DateTime DateTimeNonNullable { get; set; } = DateTime.Today;
        public DateTime? DateTimeNullable { get; set; } = DateTime.Today;
        [Display(Name = "DateTimeNullableWithDisplay")]
        public DateTime? DateTimeNullableWithDisplay { get; set; } = DateTime.Today;
        [DisplayName("DateTimeNullableWithDisplayName")]
        public DateTime? DateTimeNullableWithDisplayName { get; set; } = DateTime.Today;
    }

DisplayTemplates \ DateTime.cshtml

@model DateTime
@Html.LabelForModel()
<label>@Html.DisplayNameFor(m => m)</label>
<span>@Html.ValueForModel()</span>

EditorTemplates \ DateTime.cshtml

@model DateTime
@Html.LabelForModel()
<label>@Html.DisplayNameFor(m => m)</label>
<input type="datetime" id="@Html.IdForModel()" name="@Html.NameForModel()" value="@Html.ValueForModel()"/>

Отображаемое имя не отображается в элементах Nullable через LabelForModel или DisplayNameForModel (однако DisplayNameFor (m => m.Field) и LabelFor (m => m.Field) это делают, но DisplayNameFor (m => m)и LabelFor (m => m) нет) Результат

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Таким образом, с дальнейшими исследованиями выясняется, что проблема в @model DateTime строке. Пост, который дал мне достаточно подсказок для отслеживания, был this Шаблон получает DateTime?как обнуляемый объект, поэтому не знает, что ему нужно получить доступ к другим свойствам, чтобы получить некоторые из метаданных.

Есть два способа решить эту проблему: универсальный @model dynamic или строго типизированный @model DateTime? Это подтвердилось, когда я нашел этот комментарий в исходном коде здесь

We don't want to search for Nullable<T>, we want to search for T (which should handle both T and Nullable<T>).

0 голосов
/ 22 мая 2019

Вы пробовали использовать @Html.LabelFor(m => m.NullableProperty)?Это также должно отобразить значение атрибута DisplayName.

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