Подтвердить что ты не робот

Как создать шаблон MVC Razor для DisplayFor()

У меня есть несколько свойств в моей модели просмотра, которые отображаются только для отображения, но мне нужно получить их значения с помощью jQuery для выполнения вычисления на странице. Стандартный метод Html.DisplayFor() просто записывает их значение на страницу. Я хочу создать шаблон бритвы, который позволит мне отображать каждый элемент как:

<span id="ElementsId">Element value</span>

Я знаю, что могу указать шаблон в Html.DisplayFor(), чтобы использовать конкретный шаблон для отображения свойства, но внутри этого шаблона, как определить идентификатор id для записи в тег span?

@Html.DisplayFor(model => model.Element, "MyTemplate");
4b9b3361

Ответ 1

Хорошо, я нашел его, и это на самом деле очень просто. В моей папке Views\Shared\DisplayTemplates у меня есть Read.cshtml, содержащий следующее:

@model System.Int32
<span id="@ViewData.ModelMetadata.PropertyName">@Model</span>

Это отображает правильный тег, используя имя свойства как атрибут id и значение свойства в качестве содержимого:

<span id="Reading">1234</span>

В файле просмотра это можно вызвать, используя следующее:

@Html.DisplayFor(model => model.Reading, "Reading")

Или, если свойство модели украшено UIHint ( "Чтение" ), тогда имя шаблона можно оставить вне вызова DisplayFor(), и оно все равно будет отображаться с использованием шаблона:

@Html.DisplayFor(model => model.Reading)

Это должно хорошо работать с настраиваемыми шаблонами редактора.

Ответ 2

Вы можете сделать эту часть id модели представления и использовать ее в шаблоне отображения:

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>

Ответ 3

Я прочитал много SO-сообщений о том, как определить шаблон для @Html.DisplayFor для логического свойства, но не смог понять их ясно. Ваш вопрос близок к этому, и после его понимания я решил добавить новый ответ, включающий полностью все шаги для его реализации. Это может быть полезно для других людей.

1. Создание шаблона

Сначала вам нужно добавить Partial View в путь ниже (путь очень важен):

Views/Shared/DisplayTemplates/

Например, я создал Partial View именем _ElementTemplate и _ElementTemplate его так:

<span>
    @(@Model ? "Yes" : "No")
</span>

2. Добавление UIHint к модели

Чтобы установить связь между вашим property и template, вы должны добавить атрибут UIHint как UIHint ниже в классе вашей модели:

[UIHint("_YesOrNoTemplate")]
public bool MyProperty { get; set; }

3. Использование @Html.DisplayNameFor в представлении

При каждом просмотре этого свойства вы можете использовать следующий код:

<div>
    @Html.DisplayFor(modelItem => item.MyProperty)
</div>

Выход

Приведенный выше код отображается в следующем примере (if (MyProperty == true)):

<div>
    <span>
        Yes
    </span>
</div>

Настройка атрибутов

Для установки id или других атрибутов HTML вы можете использовать ModelMetadata следующим образом:

<span id="@ViewData.ModelMetadata.PropertyName">
    @(@Model ? "Yes" : "No")
</span>

Вывод с атрибутом

<div id="MyProperty">
    <span>
        Yes
    </span>
</div>

Ответ 4

Здесь статья, объясняющая Templates (Display + Editor) в Razor, а также атрибут UIHint.

Ответ 5

У меня была точно такая же проблема, как и исходная запись.

Не уверен, что последний комментарий действителен. Это сделало бы атрибут HTML id значением времени выполнения и, следовательно, не может ссылаться на имя времени разработки.

Я использовал перегрузку DisplayFor, которая позволяет добавлять новые объекты в словарь данных (ViewBag)

Моя модель - это объект С#, называемый Project с различными свойствами. На мой взгляд, у меня есть следующее:

@Html.DisplayFor(model => model.ProjectName, "StringDisplaySetHtmlID", new { HtmlID = "project-name" })

Это использование настраиваемого шаблона StringDisplaySetHtmlID, а последний параметр добавляет пару значений ключа в Сумку просмотра.

Мой файл шаблона выглядит так:

@model string
<span class = "display-field" id = "@(ViewBag.HtmlID)">@Model</span> 

Я также создаю класс для стилизации. Я использовал ключевое имя HtmlID, а не только идентификатор, чтобы избежать потенциального общего столкновения имен.

Теперь в моем javascript я могу получить содержимое диапазона, используя следующий jquery:

var projectName = $('#project-name').text()

Ответ 6

Лучший способ создать шаблон отображения, который будет выводить следующее:

<span id="ElementsId">Element value</span>

Будет ли это:

<span id="@Html.IdForModel()">@Html.DisplayTextFor(m => m)</span>

Этих помощников, возможно, не существовало, когда этот вопрос был впервые опубликован, но это основано на ответе Дэвида двумя способами:

  1. Использование @Html.DisplayTextFor(m => m) вместо @Model будет по-прежнему использовать аннотации данных при отображении значения, а не просто по существу запускать ToString() на нем.
  2. Использование @Html.IdForModel() вместо @ViewData.ModelMetadata.PropertyName было бы предпочтительным в тех случаях, когда модель является вложенной или повторяющейся, а идентификатор не будет просто именем свойства.