11

我有一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的类型。ItemDisplayTemplates\Item.cshtml

由于相同的“if/is”链,HTML 助手也无济于事。

我可以将渲染逻辑合并到类本身中,然后调用,@Model.Render()但它们属于业务逻辑,而不是表示。这将是一种罪过。

只有一个选项,@Html.Partial(Model.GetType().Name)但感觉不对。您期望一个没有元魔法的解决方案。有没有更好的办法?

4

2 回答 2

6

使用显示模板。

在您的~/Views/Shared/DisplayTemplates文件夹中,您可以添加与您的类型同名的视图。

当您这样做时,@Html.DisplayFor(item)您将获得与该特定类型相关的视图。

更新

我刚刚看到您对 RE DisplayFor 的评论,所以如果这没有帮助,我将删除我的答案。

于 2013-10-10T13:14:49.800 回答
5

我认为你的方法很好。您可以使用这样的扩展方法使其变得更好:

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);
}
于 2013-10-10T13:14:51.560 回答