2012-02-27 16 views
1

私はmvcにとってかなり初心者です。私はブログのようなWebアプリケーションを設計しているので、より経験豊富なものから一つ知りたいものです。問題は、ブログ記事とそのコメントを入力するためのボックスが表示されていることです。完全な抽象的な解決策は、記事とコメントの両方のクラスでこのビューを強く入力することですが、わかっているように、不可能です。 このケースを処理する最善の方法は何ですか?これは記事のビューであるため、これは記事クラスで入力する必要があります。一方、コメントクラスで入力するとViewBagで記事フィールドを渡す方が簡単になります。私はそれが論理的に正しいとは思えません。それはクラスでタイプされるべきではありません。それはここに直接表されていません(記事は主なものです)。2種類のタイプの強力なタイピングが必要な場合

コメントを簡単に追加して検証し、明確な方法で他に解決する方法はありますか? ありがとうございます。

編集:メイン "問題"は既存のコメントのリストを処理するのではなく、新しいものを追加することです - コントローラ側でViewModelのFormCollectionで簡単に使用できますか?

+1

投稿とコメントクラスを持つBlogPostクラスがないのはなぜですか? –

+0

構図は良い解決策だと思いますが、複数のクラスの代わりに複数のインターフェースを継承することができます。複数のインタフェース継承が可能です。 – mydogisbox

答えて

6

この場合、ViewModelを使用します。このような何か:

public class Article 
{ 
    public string Text { get; set; } 
} 

public class Comment 
{ 
    public string Text { get; set; } 
} 

public class BlogPostViewModel 
{ 
    public Article Article { get; set; } 
    public IEnumerable<Comment> Comments { get; set; } 
} 

のViewModel:ドメインモデル(またはモデル)の間の接続オブジェクト[CommentあなたのケースではとArticle]と[あなたのケースでは、あなたのブログのポストビュー]を表示。ここで

@model BlogPostViewModel 

@* you can reference Model.Article, as well as Model.Comments here *@ 

ASP.NET MVC View Model Patternsの良い作業例です:

あなたのビューは次のようになります。対処方法は、あなたのポストされたデータを受信するために、次に:

編集

[HttpPost] 
public ActionResult YourBlogView(BlogPostViewModel bpvm) 
{ 
    // here you have access to the binded model 
    // i.e. bpvm.Article 
} 
+0

でも問題は(主に)同じビューにコメントを追加することです。この場合、コントローラー側のFormCollectionを使用して新しいものを処理できますか? – deha

+0

@dehaこの新しいデータ(コメント)をPOSTアクションに渡すために、入力(直接DOMかInputExtensionsかにかかわらず)を使用します。 –

+0

いくつかの簡単なコード例を表示できますか?私は主にコントローラメソッドのパラメータに興味があります... – deha

2

完全な抽象的な解決策は、記事とコメントの両方のクラスでこのビューを強く入力することですが、わたしたちが知る限り、不可能です。

でも可能です。それはViewModelと呼ばれています。

あなたはCRUDモデルで少し固定されているようです。主流に見えますが、これはコード生成とテンプレート作成に役立つ唯一のアプローチだからです。

より良い見通しを得るには、標準MVCテンプレートのAccountModelsをご覧ください。

2

は、新しいモデルを使用してください:

public class ArticleAndCommentsModel { 
    public ArticleModel Article { get; set; } 
    public IEnumerable<CommentModel> Comments { get; set; } 
} 

ビューはViewPage<ArticleAndCommentsModel>を継承します。

0

は、私は2つのオプション

  1. は記事とのviewmodelとコメントコレクションの作成を参照してくださいすることができ
  2. コメントセクションを別のビューとして(同じページ上に)レンダリングします。
0

ViewModelの代替方法は、ArticleViewBagに置き、そこから参照してCommentをページのモデルにすることです。これは、ユーザーが記事を変更しないことを前提としています。

関連する問題