简体   繁体   中英

How to connect more than one model or more than one view model in a single razor view?

I'm working on a basic application.

This is the main 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);
    }

In this controller Index and Details Methods are connected to two different razor views as follows:

This is the razor view for Index

@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>

This is the razor view for Details

@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>

This is the mainViewModel

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

Now in the main controller above, if you have noticed i have a third method as count which is connected to a partial view as follows:

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

And the countVm or (count view model) is as follows:

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

Everything is working fine till this moment, Now as per application requirement i have to add this count partial view to all other razor views as follows:

 @Html.Partial("count")

But when i add it into Index or Details razor views it generates an error as:

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'.

Now lets say this count method has some identical data that has to be passed to all other razor views but not separately, because separately passing will be time consuming and suppose tomorrow due to any reason if the logic is updated then i have to go to each and every single method individually and have to update them accordingly, which is not possible if we are assuming more than 100 methods.

So in short, i am looking for a way to retrieve data from two view models in a single razor view?

Instead of calling the Partial view what you can do is call the Action which will return the partial view back with model filled:

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

Alternatively we can add that count view model in the main view model as property and then pass it to the partial view when rendering like:

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

and in main view model you can have it :

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM