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>