如何在视图中使用两个相同的模型? [MVC4]

时间:2014-08-30 05:04:24

标签: asp.net-mvc-4

我正在尝试创建一个状态更新页面,我希望用户在索引页面中插入状态消息,同时,我想在同一个索引页面中显示所有插入的所有状态消息。

这是我的型号代码:

public class Statuses
{
    [Key]
    public int StatusID { get; set; }
    [DataType(DataType.MultilineText)]
    [Required]
    public string message { get; set; }
}
public class StatusContext : DbContext
{
    public DbSet<Statuses> Status { get; set; }
}

而且,我在Index.cshtml页面中使用了

@Html.EditorFor(model => model.message)

为了显示编辑器,我在View中使用了以下模型。

@model LearnStart.Models.Statuses

但是,为了显示Multiline TextArea下面的所有状态消息,我想我应该使用下面的状态消息。

@model IEnumerable<LearnStart.Models.Statuses>

如何在同一视图中使用这两个模型,以便我可以同时显示文本区域(插入状态消息)并列出其下面的所有可用状态消息?

2 个答案:

答案 0 :(得分:2)

首先,您不应该将您的实体直接传递给您的视图。建议的最佳做法是使用View Models,它是专为您的视图量身定制的模型。

其次,使用视图模型时,您现在可以执行此操作,因为它与数据模型实体无关:

public class MyActionViewModel {
    public List<StatusesViewModel> StatusList {get;set;}
    public StatusesViewModel CreatedStatus {get;set}
}

然后在你看来:

@model MyActionViewModel

@Html.EditorFor(x => x.CreatedStatus)

.............................................

@Html.DisplayFor(x => x.StatusList)

然后你可以创建两个模板,一个EditorTemplate和一个DisplayTempate:

~/Views/Shared/EditorTemplates/StatusesViewModel.cshtml

@model StatusesViewModel

@using(Html.BeginForm()) {
    @Html.EditorFor(x => x.Message)
    <input type="submit" value="Create Status" />
}

~/Views/Shared/DisplayTemplates/StatusesViewModel.cshtml

@model StatusesViewModel

<div>
    <span>@Model.Message</span>
</div>

使用模板的好处在于它们会自动遍历您的集合。不使用foreach或for语句。单个EditorFor适用于整个集合,然后根据类型呈现模板,在这种情况下转换为StatusViewModel.cshtml

答案 1 :(得分:-1)

简单的方法是在Viewbag中放置一个列表,并在View中显示列表,如下所示: -

控制器:

Public Actionresult Myaction()
{
   .........
   Viewbag.data = //bind list of messages here
   return View();
}

查看:

@model LearnStart.Models.Statuses
.........
.........
.........
@if(Viewbag.data != null){
 <table>
 @foreach(var item in Viewbag.data)
  {
    <tr><td>@item.message</td></tr>
  }
 </table>
}