Asp.net mvc 4 如何在视图中使用两个相同的模型?[MVC4]

Asp.net mvc 4 如何在视图中使用两个相同的模型?[MVC4],asp.net-mvc-4,Asp.net Mvc 4,我正在尝试创建一个状态更新页面,我希望用户在该页面的索引中插入状态消息,并且我希望在同一索引页面中显示所有插入的状态消息 这是我的型号代码: public class Statuses { [Key] public int StatusID { get; set; } [DataType(DataType.MultilineText)] [Required] public string message { get; set; } } public clas

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

这是我的型号代码:

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; }
}
然而,为了显示多行文本区域下方的所有状态消息,我想我应该使用下面的一个

@model IEnumerable<LearnStart.Models.Statuses>
@model IEnumerable

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

简单的方法是在
视图包中放置一个列表,并在视图中显示列表,如图所示:-

控制器:

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>
}
@model LearnStart.Models.status
.........
.........
.........
@如果(Viewbag.data!=null){
@foreach(Viewbag.data中的var项)
{
@item.message
}
}

首先,不应将实体直接传递给视图。建议的最佳实践是使用视图模型,这些模型是专门为您的视图定制的模型

其次,在使用视图模型时,您现在可以这样做,因为它与数据模型实体无关:

public class MyActionViewModel {
    public List<StatusesViewModel> StatusList {get;set;}
    public StatusesViewModel CreatedStatus {get;set}
}
然后可以创建两个模板,一个EditorTemplate和一个DisplayTemplate:

~/Views/Shared/EditorTemplates/StatusesViewModel.cshtml

@model StatusesViewModel

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

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

使用模板的好处在于,它们会自动迭代您的集合。。不使用foreach或for语句。一个EditorFor可以处理整个集合,然后根据类型呈现模板,在本例中转换为
StatusViewModel.cshtml

在您的情况下,您首先需要获取消息列表,所以最好的方法是将该消息列表绑定到ViewBag中,并将该ViewBag绑定到视图端的textarea。如果您需要一些代码,请告诉我。您建议他修改其实体以包含自引用导航属性。除了这在他的数据模型中没有意义之外,它在他的代码的其余部分中也有影响,所有这些都与视图中的数据显示相关。状态之间没有关系。这是一个糟糕的建议。@ErikFunkenbusch。在这种情况下,我也给了他另一个选择。而且,如果答案是错误的,就应该投反对票。而上面的答案并没有错。如果答案是错误的,就应该投反对票。你建议他用核武器破坏他的数据模型,把它搞砸。这值得向下投票。@ErikFunkenbusch…这是你的观点…在我看来,两个答案都是正确的,都会起作用..谢谢..@Exception在做了你所说的之后,我在考虑的每个部分都得到了NullReferenceException。查看我的控制器代码以进行更正。public ActionResult Index(){Statuses obj=new Statuses();obj.statlst=db.Status.ToList();return View(obj);}我需要在模型中单独编写MyActionViewModel类吗?如果是这样,请查看我已经有了“状态”模型。@Arjun,使用
语句在项目中为
类MyActionViewModel
(和其他视图模型)创建一个单独的文件夹(例如)
ViewModels
,并使用相关的
。正如Erik所说,使用视图模型是推荐的方法。这可能有助于理解这些好处。@Arjun-是的,我知道你有一个状态模型。但是,这是您的数据实体,在您的视图中直接使用此模型并不是最佳实践。您应该创建视图模型版本以在视图中使用。是的,这需要更多的工作,但它也更易于维护,不会给您的数据模型带来太多问题。
@model StatusesViewModel

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

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

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