繁体   English   中英

有条件地为列表中具有不同基础类型的项目选择视图模型,而无需显式检查和转换每个项目

[英]Choose view model condtionally for items with different underlying types in a list, without explicitly checking and casting every item

我有一些视图和所属的视图模型,这些视图模型用于我网站上特定内容类型的清单中。

当我列出搜索结果时,我想重用这些视图模型,这些内容类型在一个列表中一起显示。

我将搜索结果项作为API项获取,然后可以继续查找项的基础类型并将它们映射到相应的视图模型(用于文档的DocumentViewModel,用于新闻页面的NewsPageViewModel等)。

我真正想做的是这样的:将搜索命中项映射到基础内容类型的正确视图模型。 然后将视图模型作为动态对象以及指定其支持类型的属性以及视图路径/名称的属性返回。

    Model.dynamicItems =  new List<dynamic>()
    {document, newsPage};
    foreach(var item in Model.dynamicItems)
    {
            @{ Html.RenderPartial(item.viewName, (item.Type) item );}
    }

但据我所知这是不可能的,因为缺乏鸭子类型。

我想像这样的东西可能会起作用,但是感觉很丑且重复:

public Interface ISearchInterfaceItem
{
    string viewName {get; set;}
}

public class DocumentViewModel : ISearchInterfaceItem 
{
    ...
}

public class NewsPageViewModel : ISearchInterfaceItem 
{
    ... 
}


Model.SearchInterfaceItems =  new List<ISearchInterfaceItem>()
{newsPageItem, document};

foreach(var item in Model.SearchInterfaceItems)
{
    if(item as DocumentViewModel != null)
    {
        @{ Html.RenderPartial(item.viewName, (DocumentViewModel) item );}
    }

    else if (item as NewsPageViewModel != null)
    {
        @{ Html.RenderPartial(item.viewName, (NewsPageViewModel) item );}
    }

有什么好的方法可以做到这一点吗?

如果不使用接口,为什么要在世界上实现它们呢? 做就是了:

foreach (ISearchInterfaceItem item in Model.SearchInterfaceItems)

(然后,您甚至无需稍后投放。)

好消息是,mvc为此提供了一些简单方法。

-在共享文件夹中创建一个EditorTemplates文件夹。

-在此文件夹中创建局部视图。

-视图的名称应该是它显示的类型的名称。

-在您的视图中调用EditorForModel辅助方法。

如果您不进行编辑,则还可以使用DisplayTemplates。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM