1

派生クラス、インターフェイス、およびビューモデルをいじりましたが、必要なものをまったく作成できませんでした。

次のモデルで CMS を構築しているとします。

記事項目

  • 題名

  • 概要

  • コンテンツ

ニュース記事

  • 見出し

  • 公開日

  • 概要

  • コンテンツ

イベントアイテム

  • イベントタイトル

  • 開始日

  • 終了日

  • コンテンツ

これらの表示を 1 つの形式 / ビューに標準化する方法を探しています (たとえば、同じ RSS フィードにすべて表示できるようにするため)。標準化されたビューはHTMLItemと呼ばれ、3 つのフィールドを持つ場合があります。

  • 題名

  • 概要

  • コンテンツ

ArticleItemはHTMLItemに直接変換されます。これは簡単です。

NewsItemの場合、 PublishDate とコンテンツの最初の 100 文字を結合して、 HTMLItem の Summary フィールドを作成したいと思います。

EventItemについては、 StartDate と EndDate を組み合わせて HTMLItem の Summary フィールドを作成したいと思います

最終的に、3つのモデルをHTMLItemを表示するように設計された単一のビューに渡すことができる最も簡単で効率的な方法を探しています。これまでの私のベスト ショットは、モデルごとに「コンバーター」クラスを作成することでしたが、これを行うためのより良い方法があると感じずにはいられません。

経験、専門知識、アドバイスをいただければ幸いです。

4

3 に答える 3

1

標準化されたプロパティと各特殊クラスのコンストラクターを使用して 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-04T14:54:11.233 に答える
0

プロジェクトでViewmodelパターンを使用できます

モデルと ViewModel は異なります。ViewModel と MVVM パターンを混同しないでください。

ビュー モデルを使用すると、モデルとビューの間のやり取りがより簡単になります。モデルは、他のモデルオブジェクトをメンバーとして持つと、モデルオブジェクトをメンバーとして持つことができるなど、非常に複雑になることがあります.

ビューモデルを使用することで、ビューが扱うものを単純化する良い方法が得られます。これにより、インテリセンスで表示できるものもフィルターダウンされるため、モデルの開発者とビューの作業者が異なる場合、単純なビュー モデルを作成すると、UI を扱うだけの人にとってははるかに簡単になります。

于 2013-03-04T11:35:27.960 に答える
0

これに対する単純で最も一般的な解決策は、複合ビュー モデル クラスを作成することです。これは、構成されたクラス (ドメイン モデルへの参照を含む)、または各クラスのプロパティを個別に参照するフラット化されたクラスにすることができます。

だからあなたはこれを行うことができます:

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などのサードパーティ ツールを使用することもできます

ほとんどのシナリオでは、必要なデータのみを送信できるフラット ビュー モデルを好む傾向があります。また、入力検証用のデータ注釈をドメイン モデルではなくビュー モデルに配置することもできます。

于 2013-03-04T13:17:08.107 に答える