ASP.NET MVC2 - определить, какой тип шаблона отображается
Вместо использования DisplayFor и EditorFor я хотел бы создать более общий ContentFor. В этом расширении Html он будет учитывать значения метаданных, чтобы определить, как отобразить результирующий элемент управления. Единственная часть головоломки, которую я не могу определить, это: Есть ли способ определить, отображаю ли я в настоящее время DisplayTemplate или EditorTemplate. В качестве реального примера этого при рендеринге строки для отображаемой версии я хотел бы отобразить ее как, но при рендеринге версии редактора я бы хотел отобразить ее как текстовое поле.
Чтобы лучше объяснить, скажем, у меня есть два шаблона с именем Address.ascx, один в каталоге DisplayTemplates и один в каталоге EditorTemplates. Я хотел бы, чтобы они оба использовали ContentFor для рендеринга, но в отображаемой версии он отображается как метка, а в версии редактора - как текстовое поле.
1 ответ
Использование двух файлов ASCX для вызова одного файлового элемента управления (что выполнимо, просто сделайте другой RenderPartial или DisplayFor/LabelFor) не имеет смысла для меня. Это нарушает "разделение проблем". Метка отображает метки, а Дисплей отображает значения, поэтому элементу управления не имеет смысла пытаться выяснить, каким образом вы хотите, чтобы он отображался.
Если вы хотите использовать пользовательское отображение или метку для свойства, используйте аннотацию данных UIHint.
[UIHint("MyCustomControlName")]
Затем в DisplayTemplates и EditorTempaltes создайте файл "MyCustomControlName.ascx", чтобы отобразить это свойство так, как вы хотите. Кроме того, элементы управления ascx могут читать пользовательские метаданные модели и делать все, что вам нужно. Пример на http://weblogs.asp.net/seanmcalinden/archive/2010/06/11/custom-asp-net-mvc-2-modelmetadataprovider-for-using-custom-view-model-attributes.aspx.