Как создать шаблон MVC Razor для DisplayFor()
У меня есть несколько свойств в моей модели просмотра, которые отображаются только для отображения, но мне нужно получить их значения с помощью jQuery для выполнения вычисления на странице. Стандартный метод Html.DisplayFor() просто записывает их значение на страницу. Я хочу создать шаблон бритвы, который позволит мне отображать каждый элемент как:
<span id="ElementsId">Element value</span>
Я знаю, что могу указать шаблон в Html.DisplayFor(), чтобы использовать конкретный шаблон для отображения свойства, но внутри этого шаблона, как определить идентификатор id для записи в тег span?
@Html.DisplayFor(model => model.Element, "MyTemplate");
Ответы
Ответ 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>
Этих помощников, возможно, не существовало, когда этот вопрос был впервые опубликован, но это основано на ответе Дэвида двумя способами:
- Использование
@Html.DisplayTextFor(m => m)
вместо @Model
будет по-прежнему использовать аннотации данных при отображении значения, а не просто по существу запускать ToString()
на нем. - Использование
@Html.IdForModel()
вместо @ViewData.ModelMetadata.PropertyName
было бы предпочтительным в тех случаях, когда модель является вложенной или повторяющейся, а идентификатор не будет просто именем свойства.