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


我有一个 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) 但感觉不对。你期待一个没有元魔法的解决方案。有没有更好的办法?


4380
2017-10-10 13:08


起源

这是一个非常好的问题,我还没有碰到这个问题。我希望达林这样的人看到这个。但我只是好奇。如果你构建了一个名为的显示器 XItem,它不会被选中而是? 我猜你说你已经尝试过了。 - Mike Perrenoud
@musefan我可以为每个派生类型提供多个文件。我不好写if语句决定包含哪些。 - Sedat Kapanoglu
你能更具体地说明为什么你有这样的课程吗?如果您可以提供更多信息,也许提供解决方案会更容易。到目前为止,它听起来像一个糟糕的架构决定...... - walther
使用派生类型的显示模板将起作用,我有一个应用程序来执行此操作。 - Jamie Ide
伙计们我很抱歉显然DisplayFor确实有效,但由于编码错误我错过了它。所以 DisplayFor 仍然是要走的路。感谢您钻研这个。 - Sedat Kapanoglu


答案:


使用显示模板。

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

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

UPDATE

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


6
2017-10-10 13:14



这里有一个例子。 stackoverflow.com/questions/4825620/... - Jeroen Vannevel
实际上这似乎是要走的路。感谢杰米保持这种状态直到我澄清事情。 - Sedat Kapanoglu


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

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);
}

5
2017-10-10 13:14