如何以不同的方式呈现类的派生类型?

Sed*_*glu 11 c# asp.net-mvc razor

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>
Run Code Online (Sandbox Code Playgroud)

遗憾的是@Html.DisplayFor()并没有在这种情况下工作,因为Model是类型的Item,DisplayTemplates\Item.cshtml则显示.

由于相同的"if/is"链,HTML帮助程序也无济于事.

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

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

Jam*_*xon 6

使用显示模板.

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

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

UPDATE

我刚刚看到你的评论RE DisplayFor所以如果这没有帮助我将删除我的答案.


Ufu*_*arı 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);
}
Run Code Online (Sandbox Code Playgroud)