如何使用asp.net mvc 5在页面上使用多个模型?

时间:2015-06-10 16:02:02

标签: c# razor asp.net-mvc-5

我想使用2个型号。第一个位于Index.cshtml页面,第二个位于_Layout.cshtml页面

在包含动作public ActionResult Index(){...}的控制器中,我声明了一些值并将其返回给View()。像这样:

public ActionResult Index()
{
   HomePageViewModel model = new HomePageViewModel();
   // do something...
   return View(model);
}

MyProjectName.Models中,我编写了一些类来检查登录帐户并将其放在页面_Layout.cshtml上。像这样:

在页面_Layout.cshtml上:

@using MyProjectName.Models
@model MyProjectName.Models.LoginModel

@if (Model.LoginAccount != null)
{
   foreach(Account acc in Model.LoginAccount)
   {
      @Html.ActionLink(@acc.Email, "SomeAction", "SomeController", null, new { id = "loginEmail" })
      @Html.ActionLink("Logout", "SomeAction", "SomeController", null, new { id = "logout" })
   }
}

_Layout.cshtml页上的代码无效。它说:我已经返回了一个模型(HomePageViewModel model),但是我要渲染的一些值是从MyProjectName.Models.LoginModel引用的

主要要求是:第一个模型用于显示页面Index.cshtml上的内容,第二个模型用于检查用户登录(页面_Layout.cshtml)。

你能告诉我怎么做吗?谢谢!

2 个答案:

答案 0 :(得分:1)

在您的布局中,使用Html.Action()Html.RenderAction()来调用ChildActionOnly方法,该方法会返回LoginModel的部分视图

[ChildActionOnly]
public ActionResult Login()
{
  LoginModel model = // initialize the model you want to display in the Layout
  return PartialView(model);
}

并创建一个显示链接的局部视图,然后在Layout

@ { Html.RenderAction("Login", "yourControllerName") }

答案 1 :(得分:0)

更好的方法是使用部分视图和ViewBag。

在你的控制器中你会做类似的事情:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Accounts = new AccountsViewModel();
        ViewBag.HomePage = new HomePageViewModel();

        return View();
    }
}

从这里开始,您可以将模型从ViewBag传递到局部视图

@{
    AccountViewModel Accounts = (AccountViewModel)ViewBag.Accounts;
}

@Html.Partial("_accountPartial", Accounts)