如何在一个剃刀视图中连接多个模型或一个视图模型?

时间:2018-12-17 08:14:21

标签: c# razor model-view-controller

我正在开发一个基本应用程序。

这是主控制器:

   public ActionResult Index()
    {
        var all = _context.mainz.ToList();
        var vm = new mainViewModel()
        {
            main_lst = all
        };

        return View(vm);
    }

    public ActionResult Details()
    {
        var dtl = _context.mainz.ToList();
        var vm = new mainViewModel()
        {
            main_lst = dtl
        };
        return View(vm);
    }


       public ActionResult count()
    {
        var ct = (from i in _context.mainz
                  where i.event_title != null
                  select i).ToList();
        var vm = new countVm()
        {
          count = ct
        };
        return View(vm);
    }

在此控制器中,“索引”和“详细信息方法”分别连接到两个不同的剃刀视图,如下所示:

这是索引的剃刀视图

@model testtt.ViewModel.mainViewModel

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}



<ul>
@foreach (var item in Model.main_lst)
{
    <li>@item.event_title</li>
}

</ul>

这是“详细信息”的剃刀视图

@model testtt.ViewModel.mainViewModel
@{
ViewBag.Title = "Details";
Layout = "~/Views/Shared/_Layout.cshtml";
 }

<ul>
@foreach (var item in Model.main_lst)
{
   <li>@item.event_description</li>
}
</ul>

这是mainViewModel

namespace testtt.ViewModel
{
public class mainViewModel
{
    public List<main> main_lst { get; set; }
    public mainViewModel()
    {
        main_lst = new List<main>();
    }
}
}

现在在上面的主控制器中,如果您注意到我有第三个方法作为count,则该方法连接到局部视图,如下所示:

@model testtt.ViewModel.countVm
<p>count is @Model.count.Count()</p>

countVm或(计数视图模型)如下:

namespace testtt.ViewModel
{
public class countVm
{
    public List<main> count { get; set; }
    public countVm()
    {
        count = new List<main>();
    }
}
}

到目前为止,一切正常 现在,根据应用程序要求,我必须将此count部分视图添加到所有其他剃刀视图中,如下所示:

 @Html.Partial("count")

但是当我将其添加到“索引”或“详细信息”剃刀视图中时,它会产生如下错误:

The model item passed into the dictionary is of type 'testtt.ViewModel.mainViewModel', but this dictionary requires a model item of type 'testtt.ViewModel.countVm'.

现在让我们说这个计数方法具有一些必须传递到所有其他剃刀视图的相同数据,但不能分别传递,因为分开传递将非常耗时,并且假设由于某种原因如果明天更新逻辑,则明天我必须分别访问每个方法并必须对其进行相应的更新,如果我们假设有100个以上的方法,则不可能。

简而言之,我正在寻找一种在单个剃刀视图中从两个视图模型检索数据的方法?

1 个答案:

答案 0 :(得分:2)

代替调用Partial视图,您可以做的是调用Action,该操作将返回填充了模型的Partial视图:

@Html.Action("count","controllername")

或者,我们可以将该计数视图模型作为属性添加到主视图模型中,然后在渲染时将其传递给局部视图,例如:

@Html.Partial("count",Model.CountVM)

在主视图模型中,您可以拥有它:

public class mainViewModel
{
    public List<main> main_lst { get; set; }

    public countVm CountVM { get; set; }
    public mainViewModel()
    {
        main_lst = new List<main>();
    }
}