N 2 MS Mvc Examples学習記録(2)–モデルクラス

13909 ワード

モデルクラスを検討すると,全部で6つのクラスがあり,それらはすべて含まれている内容を表している.
1. AbstractPage
   1: [WithEditableTitle, WithEditableName]
   2: public abstract class AbstractPage : ContentItem, INode
   3: {
   4:     public string PreviewUrl
   5:     {
   6:         get { return Url; }
   7:     }
   8: }

この抽象クラスは、ページで表示されるすべてのコンテンツ項目を表します.WithEditableTitleプロパティでは、このようなTitleプロパティを編集できます.WithEditableNameでは、このようなNameプロパティを編集できます.定義した読み取り専用プロパティPreviewUrlは、Url値を直接返しますが、何の役にも立たないようです.
2. ContentPage
   1: [Definition("Content Page", Installer = N2.Installation.InstallerHint.PreferredStartPage)]
   2: public class ContentPage : AbstractPage
   3: {
   4:     [EditableFreeTextArea("Text", 100)]
   5:     public virtual string Text
   6:     {
   7:         get { return (string)(GetDetail("Text") ?? string.Empty); }
   8:         set { SetDetail("Text", value, string.Empty); }
   9:     }
  10: }

このクラスは,文字コンテンツのあるコンテンツ項目,すなわちコンテンツを持つことを表し,これは仮想的なText属性によって取得・設定される.Definitionプロパティは、ContentPageに特別な設定を指定するために使用されます.最初のパラメータはそのタイトル(N 2管理インタフェースに表示され、ページを新規作成および編集するときに表示されます)、2番目のパラメータは、N 2がこのWebサイトをインストールするときにContentPageを開始ページとして選択できるようにするプロパティInstallerを設定します(インストールの2番目のステップで表示されます).この特性ではなく、より正確なPageDefinitionで代用したほうがいいです.ContentPageクラスで定義されたTextプロパティのEditableFreeTextAreaプロパティは、TextプロパティがN 2でリッチテキストエディタで編集できることを示しています.getメソッドとsetメソッドは、実際にはより省略できます.
3. NewsPage
   1: [Definition("News")]
   2: [RestrictParents(typeof(NewsContainer))]
   3: public class NewsPage : AbstractPage
   4: {
   5:     public NewsPage()
   6:     {
   7:         Visible = false;
   8:     }
   9: 
  10:     [EditableFreeTextArea("Text", 100)]
  11:     public virtual string Text
  12:     {
  13:         get { return (string)(GetDetail("Text") ?? string.Empty); }
  14:         set { SetDetail("Text", value, string.Empty); }
  15:     }
  16: 
  17:     public virtual IEnumerable GetComments()
  18:     {
  19:         foreach (ContentItem item in GetChildren())
  20:         {
  21:             if (item is CommentItem)
  22:             {
  23:                 yield return item as CommentItem;
  24:             }
  25:         }
  26:     }
  27: }

NewsPageはニュースの内容を表し、RestrictParentsによって親ノードがNewsContainerクラスであることを制限します.そのコンストラクション関数ではVisibleプロパティをfalseに設定し、ドキュメントを表示すると、ニュースページがサイトマップに表示されないことがわかります.もちろん、ナビゲーションに表示されないこともできます.また、ニュースにはコメントがあるので、GetCommentsメソッドはすべてのコメントを返します.これは、NewsPageがコメントの親ノードであることを示しています.
4. NewsContainer
   1: [Definition("News Collection")]
   2: public class NewsContainer : AbstractPage
   3: {
   4:     public virtual IEnumerable GetNews()
   5:     {
   6:         return GetChildren(new AccessFilter(), new TypeFilter(typeof (NewsPage))).Cast();
   7:     }
   8: }

ニュースコンテナクラスは、GetNewsメソッドによって実現されるすべてのニュースをリストする役割を果たします.
5. CommentItem
   1: [Definition("Comment")]
   2: [RestrictParents(typeof(NewsPage))]
   3: public class CommentItem : AbstractPage
   4: {
   5:     public override bool IsPage
   6:     {
   7:         get { return false; }
   8:     }
   9: 
  10:     public override string IconUrl
  11:     {
  12:         get { return "~/Content/comment.png"; }
  13:     }
  14: 
  15:     [EditableFreeTextArea("Text", 100)]
  16:     public virtual string Text
  17:     {
  18:         get { return (string)(GetDetail("Text") ?? string.Empty); }
  19:         set { SetDetail("Text", value, string.Empty); }
  20:     }
  21: }

ニュースのコメントを表示するので、RestrictParentsプロパティが制約されています.また興味深いことに、個別のページに表示すべきではないので、IsPageプロパティを書き換え、常にfalseに戻るようにしました.他の属性は説明する必要はありません.
6. TextPart
   1: [PartDefinition("TextPart")]
   2: public class TextPart : ContentItem
   3: {
   4:     [EditableFreeTextArea("Text", 100)]
   5:     public virtual string Text
   6:     {
   7:         get { return (string)(GetDetail("Text") ?? string.Empty); }
   8:         set { SetDetail("Text", value, string.Empty); }
   9:     }
  10: }

このクラスは抽象的なAbstractPageから派生するのではなく、ContentItemクラスから直接派生し、WebFormのユーザーコントロールと同様にページテンプレート(ASPX)ではなくASCXテンプレートで表示されるPartDefinitionプロパティを使用して修飾されています.これにより、異なるページで再利用できます.具体的な使用はまだ検討されていない.