0

モデルを作成Messageし、これらのメッセージのリストをIndex自分のサイトに表示しました。コントローラはIEnumerable<Models.Message>オブジェクトをビューに渡します。

これらすべてのメッセージを表示するために、を使用してメッセージを繰り返し処理しています@foreachIndexただし、同じビューでフォームを作成して、新しいメッセージを作成したいと思います。簡単な作業のようですが、を呼び出すと@Html.TextAreaFor(Model.Body)次のエラーが発生します。

CS1061: 'System.Collections.Generic.IEnumerable<Models.Message>' does not contain a definition for 'Body' and no extension method 'Body' accepting a first argument of type 'System.Collections.Generic.IEnumerable<Models.Message>' could be found (are you missing a using directive or an assembly reference?)

Models.Messageに基づいて作成されたビューであるにもかかわらず、に基づいてフォームを作成することは可能IEnumerable<Models.Message>ですか?

私のモデルは:

public class Message
{
    [BsonId]
    public ObjectId Id { get; set; }

    public Citizen From { get; set; }
    public Citizen To { get; set; }

    [Required]
    [AllowHtml]
    public string Body { get; set; }

    [ScaffoldColumn(false)]
    public DateTime Date { get; set; }

    public bool IsPrivate { get; set; }
}

編集:率直に言って、フォーム用の1つのメッセージと表示用のメッセージのリストを保持する追加のモデルを作成したくありません。ほとんどの場合、フォームアクションコントローラーでは、この「拡張」モデルを処理する必要があるためです。そこにオリジナルがあるほうがきれいだと思いますMessage

しかし、どのように?

4

1 に答える 1

1

はい、それは可能です。この特定のビューの(ビュー)モデルを、次のような必要なすべてのプロパティを使用して作成する必要があります。

public class IndexViewModel(){

    public IEnumerable<Models.Message> Messages {get;set; }

    public string Body {get;set;}

    //any other properties for your form

}

コントローラで、このViewModelを作成し、データを入力します。

public ActionResult Index(){

    var vm = new IndexViewModel();
    vm.Messages = GetMessages();

    return View(vm);
}

ビューで、このViewModelをモデルとして設定すると、Model.Messagesを使用してメッセージを反復処理し、TextAreaFor(x => Model.Body)を使用してテキストエリアを作成できます。

于 2012-10-26T09:43:14.417 に答える