在另一个模型的视图上显示一个模型的数据:我做得对吗?

时间:2014-12-17 20:25:01

标签: c# asp.net-mvc razor

这个问题实际上有两个部分:

  1. 我做的是正确的吗?
  2. 部分查看我应该使用的内容吗?
  3. 我想在Home控制器的Index页面上显示我的Event模型中的记录。默认情况下,没有数据发送到Home控制器的Index视图,更不用说是否存在显示方式。我解决这个问题的方法是将Event \ Index.cshtml的大部分内容复制到Home \ Index.cshtml以及从EventController.cs到HomeController.cs的一些行。

    我在HomeController.cs中添加了第3行和第6行,如下所示:

    1  public class HomeController : Controller
    2  {
    3    private ETODbContext db = new ETODbContext();
    4    public ActionResult Index()
    5   {
    6      return View(db.Events.ToList());
    7      //return View();
    9    }
    10 ...
    

    我怀疑这是否是正确的方法,因为当我还想在同一个Home \ Index视图中显示来自另一个模型的数据时,我会怎么做?

    至于我的第二个问题,因为我已将Event \ Index.cshtml的视图代码复制到Home \ Index.cshtml中,我现在必须在两个地方维护该代码。这听起来是利用两个文件中使用的部分视图的好时机。我在这里有正确的想法吗?

1 个答案:

答案 0 :(得分:3)

关于模型的问题,您应该创建一个ViewModel,其中包含您想要表示的数据(一个模型在开头,您可以在以后添加更多模型):

public class HomeViewModel
{
    public IList<Event> Events {get;set;}
    public IList<AnotherModel> AnotherModels {get;set;}
}

然后,您将在视图中使用此模型。

在控制器操作中构造此viewmodel:

public class HomeController : Controller
{
    private ETODbContext db = new ETODbContext();
    public ActionResult Index()
    {
        var model = new HomeViewModel {Events = db.Events.ToList()};
        return View(model);
    }
}

至于问题的第二部分,你可以将w视图的相似部分提取到局部视图中,然后在两个视图中呈现:

_Events.cshtml (您可以将其放在共享文件夹中,以便在那里自动找到)

    @model IList<Event>
    <div>
        @foreach(var ev in Model)
        {
           <h2>@ev.Name</h2>
        }
   </div>

在你的家庭索引视图中:

@model HomeViewModel

<div>@Html.Partial("_Events", Model.Events)</div>

在您的事件索引视图中:

@model IList<Event>

<div>@Html.Partial("_Events", Model)</div>