我已经修改了派生类、接口和视图模型,但是我还无法创建我所需要的东西。
假设我们正在构建一个包含以下模型的CMS:
ArticleItem
NewsItem
EventItem
我正在寻找一种将这些显示标准化为一种格式/视图的方法(例如,我们可以在相同的RSS提要中显示它们)。标准化视图可以称为HTMLItem,有3个字段:
ArticleItem将直接转换为HTMLItem,这很简单。
对于NewsItem,我想加入PublishDate和内容的前100个字符来创建HTMLItem的汇总字段。
对于EventItem,我想结合StartDate和EndDate来创建HTMLItem的汇总字段。
最终,我在寻找一种最简单、最有效的方法,能够将3种模型传递到设计为显示HTMLItem的单一视图中。到目前为止,我最好的一招就是为每个型号创建一个“转换器”类,但我不禁觉得有更好的方法来做到这一点。
任何经验、专业知识和建议都将不胜感激!
发布于 2013-03-04 14:54:11
为每个专门类创建一个具有标准属性和构造函数的ViewModel:
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提要使用的方法上,只需将每个实体传递给每个查询的构造函数。如下所示:
//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;
}
}发布于 2013-03-04 11:35:27
您可以在项目中使用视图模型模式。
模型和ViewModels是不同的。不要将ViewModel与MVVM模式混淆。 视图模型的使用可以使模型和视图之间的交互更加简单。一个模型有时过于复杂,有其他模型对象作为成员,而模型对象可以作为成员等等。 通过使用视图模型,您可以很好地简化视图处理的内容。这也将过滤掉在intellisense中可以看到的内容,因此,如果您有不同的人开发模型而不是处理视图,那么创建一个简单的视图模型可以使那些只处理UI的人更加容易。
发布于 2013-03-04 13:17:08
这方面最简单和最常见的解决方案是创建一个复合视图模型类。这可以是一个组合类(包含对域模型的引用),也可以是一个扁平类,分别引用每个类的属性。
所以你可以这么做:
public class HtmlItemViewModel
{
public ArticleItem ArticleItem {get; set;}
public NewsItem NewsItem {get; set;}
public EventItem EventItem {get; set;}
} 或者这个:
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;}
} 然后,无论选择哪种方法来构造视图模型,都将将视图模型属性映射到控制器中的域模型。您可以手动进行此映射。
HtmlItemViewModel.ArticleTitle = ArticleItem.ArticleTitle;
//and so on...或者您可以使用第三方工具(如AutoMapper )
在大多数场景中,我倾向于使用平坦的视图模型,因为它允许我只发送我需要的数据,而不是更多,也不是更少。它还允许我将用于输入验证的数据注释放在视图模型上,而不是域模型上。
https://stackoverflow.com/questions/15200449
复制相似问题