Как создать шаблон MVC Razor для DisplayFor () - PullRequest
25 голосов
/ 19 апреля 2011

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

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

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

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

Ответы [ 6 ]

50 голосов
/ 20 апреля 2011

ОК, я нашел это, и на самом деле все очень просто.В моей папке Views \ Shared \ DisplayTemplates у меня есть Reading.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)

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

7 голосов
/ 19 апреля 2011

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

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
3 голосов
/ 13 августа 2018

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

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

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

Views/Shared/DisplayTemplates/

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

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

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

Чтобы установить связь между property и template, вы должны добавить атрибут 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>
2 голосов
/ 16 апреля 2015

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

1 голос
/ 04 марта 2019

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

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

Было бы это:

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

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

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

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

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

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

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

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

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

Мой файл шаблона выглядит следующим образом:

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

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

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

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