我可以使用两种模型的局部视图吗?

时间:2011-08-08 20:48:23

标签: asp.net-mvc-3 model partial-views

我正在尝试制作一个充当以下内容的部分视图:

  • 当用户未登录时,请显示注册表。

  • 当用户登录时,请显示该用户信息。

我有一个部分视图,既可以作为注册表单,也可以作为用户信息卡;取决于用户是否已登录。

由于这个局部视图必须在网站的任何地方都可见,所以我在MVC3应用程序的_layout区域写了它:

<body>
    <div id="wrapper">

        <div id="top">
            <p id="onlinecount">7890 Personas Jugando</p>
            <p id="logoncontrol">ENTRAR | REGISTRARSE</p>
        </div>

        <div id="headercontainer">
            <img src="../../Content/Images/topheadertemp.png" />
        </div>

        <div id="middle">
            <div id="playerinformation">
                @Html.Partial("_RegisterPartial") <!-- HERE! -->
            </div>            

            <div id="centerad">
                <img src="../../Content/Images/premio.png" />
            </div>

            <div id="rightad">
                <img src="../../Content/Images/ganadores.png" />
            </div>

            <div class="clear"></div>
        </div>

        <div id="bottom">@RenderBody()
        </div>

    </div>
</body>

基本上,如果用户没有登录,我需要在该部分中显示一个表单。但是,如果他登录(通过cookie或其他),我应该加载他的信息模型,以显示他的帐户的数据。

这是我被困的地方。我不知道如何为此用法加载模型。由于这是在_layout中,如果我是正确的,没有控制器对它起作用,不是吗?

有什么建议吗?

4 个答案:

答案 0 :(得分:10)

您应该查看以前的question,这与您的类似。

您应该在页面的单个模型中拥有注册和用户信息。 (所以你的问题的答案是你的页面只有一个模型。但你的模型可以由其他对象组成 - 每个部分视图一个。)

正如您在链接中看到的那样,用户只有部分视图才能使用与其相关的页面模型中的那些对象。

我认为这应该会帮助你。希望这可以帮助!祝你好运。

更新:很抱歉延迟,但这是一个可能有用的示例(许多代码):

<强>模型: 我创建了一个抽象的视图模型,其中始终包含reg和用户数据。每个页面的模型都可以继承这个摘要。

public class Registration
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class UserData
{
    public string DisplayName { get; set; }
    public int Age { get; set; }
}

public abstract class RegModelViewModelBase
{
    public string Title { get; set; }
    public Registration RegInfo { get; set; }
    public UserData UserInfo { get; set; }
}

public class MainPageViewModel : RegModelViewModelBase
{
}

<强>控制器: 在这里,我只是实例化此页面/视图(MainPageViewModel)的具体视图模型。我设置属性(可能来自数据库等)。我将视图模型传递给视图。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MainPageViewModel hpvm = new MainPageViewModel();

        hpvm.Title = "Some Cool Page";
        hpvm.RegInfo = new Registration() { Password = "blah", UserName = "dhoerster" };
        hpvm.UserInfo = new UserData() { DisplayName = "David Hoerster", Age = 125 };

        return View(hpvm);
    }
}

查看 - _Layout.cshtml: 请注意,我的模型中的第一行为我的_layout模板设置了模型对象。我从控制器获取此视图模型,我可以在_layout(或其他模板)中引用它。我在这里做的不多,除了得到一个局部视图(_RegStuff)并从我的模型(在控制器中设置)传递给我的RegInfo:

@model MvcApplication1.Models.RegModelViewModelBase

<!DOCTYPE html>
<html>
<head>
    <title>@Model.Title</title>
</head>

<body>
    @Html.Partial("_RegStuff", Model.RegInfo)
    @RenderBody()
</body>
</html>

查看 - _RegInfo.cshtml: 简单,但我再次设置我的模型类型,这个部分视图应该传入。

@model MvcApplication1.Models.Registration
<div>User Name = @Model.UserName</div>

查看 - Index.cshtml: 再次,设置模型并在索引视图中使用它。

@model MvcApplication1.Models.MainPageViewModel

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

<h2>@Model.Title</h2>
<h3>Display Name = @Model.UserInfo.DisplayName</h3>

所以在整个过程中,我可以参考控制器中的模型集。

我希望这能解释我想要达到的目标。如果没有,我可以相应更新。

谢谢!

答案 1 :(得分:0)

你可以做到这一点的一种方法是设计一个像这样的ViewModel:

public class ViewModel
{
    public PlayerCard playerCard { get; set; }
    public RegisterModel registerModel { get; set; }
}

包括两个模型。

答案 2 :(得分:0)

您可以创建一个新类“ViewModel”同时保存两个模型,
或者您可以将两个或一个模型放在ViewBag中

答案 3 :(得分:0)

我会在这里反对,并建议你不要在视图中做出这个决定。有两个单独的视图,使用自己的模型,让控制器根据用户是否登录(已验证)来确定调用哪个视图。

并不是说您正在查看的方法无法完成......您可以通过创建由您需要的每个视图模型组成的ViewModel来轻松完成此操作。我仍然会反对它。