0

我已经创建了模型并在我的站点视图中Message显示了这些消息的列表。Index控制器将IEnumerable<Models.Message>对象传递给视图。

为了显示所有这些消息,我使用@foreach. 但我也想在同一个Index视图上创建表单来创建新消息。似乎很容易,但调用@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; }
}

编辑:坦率地说,我不想创建一个附加模型,其中包含一条消息用于表单和用于显示的消息列表,主要是因为在表单动作控制器中我需要处理这个“扩展”模型。我认为清洁工会在那里有原件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

}

在您的 Controller 中,创建此 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 回答