首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有将多个模型的显示标准化为单一视图的设计模式?

是否有将多个模型的显示标准化为单一视图的设计模式?
EN

Stack Overflow用户
提问于 2013-03-04 11:26:14
回答 3查看 101关注 0票数 1

我已经修改了派生类、接口和视图模型,但是我还无法创建我所需要的东西。

假设我们正在构建一个包含以下模型的CMS:

ArticleItem

  • 标题
  • 摘要
  • 内容

NewsItem

  • 标题
  • PublishDate
  • 摘要
  • 内容

EventItem

  • EventTitle
  • StartDate
  • EndDate
  • 内容

我正在寻找一种将这些显示标准化为一种格式/视图的方法(例如,我们可以在相同的RSS提要中显示它们)。标准化视图可以称为HTMLItem,有3个字段:

  • 标题
  • 摘要
  • 内容

ArticleItem将直接转换为HTMLItem,这很简单。

对于NewsItem,我想加入PublishDate和内容的前100个字符来创建HTMLItem的汇总字段。

对于EventItem,我想结合StartDate和EndDate来创建HTMLItem的汇总字段。

最终,我在寻找一种最简单、最有效的方法,能够将3种模型传递到设计为显示HTMLItem的单一视图中。到目前为止,我最好的一招就是为每个型号创建一个“转换器”类,但我不禁觉得有更好的方法来做到这一点。

任何经验、专业知识和建议都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-04 14:54:11

为每个专门类创建一个具有标准属性和构造函数的ViewModel:

代码语言:javascript
复制
public class HtmlItemViewModel {
    //Properties
    public string Title {get; set;}
    public string Summary {get; set;}
    public string Content {get; set;}

    //Constructor inside HtmlItemViewModel for each one of the specialized classes:
    public HtmlItemViewModel(ArticleItem item)
    {
        this.Title = item.Title;
        this.Summary = item.Summary;
        this.Content = item.Content;
    }

    public HtmlItemViewModel(NewsItem item)
    {
        this.Title = item.Headline;
        this.Summary = String.Format("{0} - {1}", item.PublishDate, item.Summary.Substring(0,1000));
        this.Content = item.Content;
    }

    public HtmlItemViewModel(EventItem item)
    {
        this.Title = item.EventTitle;
        this.Summary = String.Format("{0} - {1}", item.StartDate, item.EndDate);
        this.Content = item.Content;
    }
}

然后,在您为RSS提要使用的方法上,只需将每个实体传递给每个查询的构造函数。如下所示:

代码语言:javascript
复制
//Example controller
public class RssController : Controller {
    public ActionResult GetRssFeed(){
        //Assuming you have a service for each item type
        var articleList = ArticleService.GetArticles().Select(s => new HtmlItemViewModel(s));
        var newsItemList = NewsItemService.GetNewsItems().Select(s => new HtmlItemViewModel(s));
        var eventItemList = EventItemService.GetEvents().Select(s => new HtmlItemViewModel(s));

        articleList.AddRange(newsItemList);
        articleList.AddRange(eventItemList);

        return articleList;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-04 11:35:27

您可以在项目中使用视图模型模式。

模型和ViewModels是不同的。不要将ViewModel与MVVM模式混淆。 视图模型的使用可以使模型和视图之间的交互更加简单。一个模型有时过于复杂,有其他模型对象作为成员,而模型对象可以作为成员等等。 通过使用视图模型,您可以很好地简化视图处理的内容。这也将过滤掉在intellisense中可以看到的内容,因此,如果您有不同的人开发模型而不是处理视图,那么创建一个简单的视图模型可以使那些只处理UI的人更加容易。

票数 0
EN

Stack Overflow用户

发布于 2013-03-04 13:17:08

这方面最简单和最常见的解决方案是创建一个复合视图模型类。这可以是一个组合类(包含对域模型的引用),也可以是一个扁平类,分别引用每个类的属性。

所以你可以这么做:

代码语言:javascript
复制
public class HtmlItemViewModel
{
  public ArticleItem ArticleItem {get; set;}
  public NewsItem NewsItem {get; set;}
  public EventItem EventItem {get; set;}
} 

或者这个:

代码语言:javascript
复制
public class HtmlItemViewModel
{
  //Article Item Properties
  public string ArticleTitle {get; set;}
  public string ArticleContent {get; set;}
  public string ArticleSummary {get; set;}
  //News Item Properties
  public string Headline {get; set;}
  public DateTime PublishDate {get; set;}
  public string NewsItemSummary {get; set;}
  public string NewsItemContent {get; set;}
  //Event Item Properties
  public string EventTitle {get; set;}      
  public DateTime StartDate {get; set;}    
  public DateTime EndDate {get; set;}
  public string EventContent {get; set;}
} 

然后,无论选择哪种方法来构造视图模型,都将将视图模型属性映射到控制器中的域模型。您可以手动进行此映射。

代码语言:javascript
复制
HtmlItemViewModel.ArticleTitle = ArticleItem.ArticleTitle;
//and so on...

或者您可以使用第三方工具(如AutoMapper )

在大多数场景中,我倾向于使用平坦的视图模型,因为它允许我只发送我需要的数据,而不是更多,也不是更少。它还允许我将用于输入验证的数据注释放在视图模型上,而不是域模型上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15200449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档