我正在尝试创建一个状态更新页面,我希望用户在索引页面中插入状态消息,同时,我想在同一个索引页面中显示所有插入的所有状态消息。
这是我的型号代码:
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>
如何在同一视图中使用这两个模型,以便我可以同时显示文本区域(插入状态消息)并列出其下面的所有可用状态消息?
答案 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>
}