我可以为您提供带有两个模型的部分视图吗?

3

我正在尝试创建一个部分视图,它应该具备以下功能:

  • 当用户未登录时,显示一个注册表单。

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

我有一个部分视图,根据用户是否登录,可作为注册表单或用户信息卡片使用。

由于这个部分视图必须在网站的任何地方都可见,因此我将其编写到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>

基本上,如果用户没有登录,我需要在这个partial中显示一个表单。但是,如果他已经登录(通过cookie或其他方式),我应该加载他的信息模型,以便显示他账户的数据。
这就是我的困境所在。我不知道如何加载这个模型以供使用。由于这是在_layout中,如果我没错的话,没有控制器可以对其进行操作,对吗?
有什么建议吗?

我在我的答案中添加了一个例子,希望能够描述清楚我的意思。如果您有其他问题,请告诉我。希望这可以帮助到您。 - David Hoerster
4个回答

13
您应该看一下这个类似于您的问题的先前问题
您应该将注册和用户信息放在单个模型中,以供页面使用。(因此,您的页面只有一个模型。但是您的模型可以由其他对象组成,每个部分视图使用其中的一个对象。)
所以就像您在链接中看到的那样,用户只能在部分视图中使用与其相关的页面模型中的对象。
我认为这应该会帮助您。祝好运。
更新:抱歉耽搁了一下,但是这里有一个例子(大量代码)可能会有所帮助:
模型: 我创建了一个抽象视图模型,其中始终包含注册和用户数据。每个页面的模型都可以从此抽象类继承。
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传递给它(这个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>

因此,在整个过程中,我可以引用在控制器中设置的模型。

我希望这解释清楚了我试图表达的内容。如果还不清楚,我可以相应地进行更新。

谢谢!


好的,我明白了。在局部视图中有一个大容器模型中包含两个模型。但是当我注册时,我需要看到刚刚注册的玩家卡。使用您的建议,如果模型已经加载,我该如何加载该信息? - Only Bolivian Here
你应该知道,在控制器中准备视图/模型时,如果我理解正确的话。如果你知道用户在控制器中已经注册,你可以相应地为视图准备你的模型。如果我没有正确理解你的问题,请告诉我 - 如果我误解了,先说声抱歉。 - David Hoerster
是的,那很简单。但请记住,我是从_layout中调用Html.partial的,如果我没错的话,没有任何控制器作用于它,对吧? - Only Bolivian Here
@Sergio - 不是的,加载的视图要么对应于调用的控制器方法(默认行为),要么对应于您在return View("viewname", model)中指定的方法。 - David Hoerster
好的,注意你正在加载数据以在Home/Index中显示。由于这些玩家信息应该从任何地方都可见(因此放置在_Layout上),所以我需要在每个Action中都加载该显示数据吗? - Only Bolivian Here
显示剩余2条评论

0
你可以通过设计一个像这样的ViewModel来实现这一点:
public class ViewModel
{
    public PlayerCard playerCard { get; set; }
    public RegisterModel registerModel { get; set; }
}

包含两个模型。


0
您可以创建一个名为“ViewModel”的新类来保存两个模型, 或者将其中一个或两个模型放入ViewBag中。

由于我的部分视图是从我的_layout中调用的,那么我该如何加载与已登录用户相关的模型并将其传递给部分视图呢? - Only Bolivian Here

0

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

并不是说您正在考虑的方法不可行... 您可以轻松地通过创建一个由您需要的每个视图模型组成的 ViewModel 来实现。但我仍然建议您不要这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接