Как визуализировать производные типы класса по-разному?

У меня есть класс 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);
}