ASP.NET MVC 4 определяет шаблон отображения только для строки

Я хочу создать шаблон отображения только для строковых свойств и использовать по умолчанию для всех остальных.

Я попытался сделать string.cshtml в Views/Shared/DisplayTemplates со следующим содержанием:

@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })

У меня теперь есть проблема, когда я пытаюсь открыть любое представление, которое использует DisplayFor(m => m.property), оно показывает ошибку как: Элемент модели, переданный в словарь, имеет тип 'System.DateTime', но этот словарь требует элемент модели типа 'System.String'. или: элемент модели, переданный в словарь, имеет тип "System.Int64", но для этого словаря требуется элемент модели типа "System.String".

Я знаю, что могу решить эту проблему, добавив шаблон отображения для каждого используемого типа, но я полагаю, что также можно использовать шаблон "по умолчанию" для всех типов, где пользовательский шаблон не определен?

ОБНОВЛЕНИЕ После ответа Дарина я проверил учебник Брэда и изменил шаблон на:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" })

Это основано на шаблоне "по умолчанию" и работает для всех типов.

1 ответ

Решение

Существует 9 встроенных шаблонов отображения: "Boolean", "Decimal", "EmailAddress", "HiddenInput", "Html", "Object", "String", "Text" и "Url".

Посмотрите на следующий пост в блоге, который подробно объясняет, как работают шаблоны и как они решаются. Вот цитата из этого:

Следующие имена шаблонов пробуются по порядку:

  1. TemplateHint от ModelMetadata
  2. DataTypeName из ModelMetadata
  3. Название типа (см. Примечания ниже)
  4. Если объект не сложный: "Строка"
  5. Если объект сложный и интерфейс: "Объект"
  6. Если объект сложный, а не интерфейс: выполните поиск по типу наследования для типа, пробуя каждое имя типа

Таким образом, вы переходите к пункту 4. для DateTime и Int64, потому что для этих типов нет шаблона по умолчанию.

Таким образом, вы можете использовать подсказки шаблонов или имена DataType из ModelMetadata, чтобы использовать этот пользовательский шаблон только для заданных свойств модели представления.

Другие вопросы по тегам