Как визуализировать производные типы класса по-разному?
У меня есть класс Item
. У меня есть около 10-20 производных, каждый из которых содержит разные типы данных. Теперь, когда дело доходит до визуализации различных типов Item
, я вынужден использовать подобные:
<div>
@if (Model is XItem)
{
... rendering logic 1 ...
}
@if (Model is YItem)
{
... rendering logic 2 ...
}
@if (Model is ZItem)
{
... rendering logic 3 ...
}
... goes on and on forever ...
</div>
К сожалению, @Html.DisplayFor()
не работает в этом случае, потому что Model
является типом Item
, DisplayTemplates\Item.cshtml
отображается.
HTML-помощники не помогают ни из-за одной и той же цепи "if/is".
Я мог бы включить визуализацию в самих классах и вызвать @Model.Render()
, но они относятся к бизнес-логике, а не к представлению. Это был бы грех.
Существует только один параметр @Html.Partial(Model.GetType().Name)
, но он чувствует себя не так. Вы ожидаете решения без метамагии. Есть ли лучший способ?
Ответы
Ответ 1
Использовать экранные шаблоны.
Внутри папки ~/Views/Shared/DisplayTemplates
вы можете добавить представление с тем же именем, что и ваш тип.
Когда вы выполните @Html.DisplayFor(item)
, вы получите представление, относящееся к этому конкретному типу.
UPDATE
Я только что видел ваш комментарий RE DisplayFor, поэтому, если это не поможет, я удалю свой ответ.
Ответ 2
Я думаю, что ваш подход прекрасен. Вы можете сделать это лучше с помощью метода расширения следующим образом:
public static MvcHtmlString GetTypePartial<T>(this HtmlHelper htmlHelper, T model, string viewPrefix = "")
{
string typeName = typeof (T).Name;
string viewName = string.Concat(viewPrefix, typeName);
return htmlHelper.Partial(viewName, model);
}