【问题标题】:Can I have partial view that uses two models?我可以有使用两个模型的局部视图吗?
【发布时间】:2011-08-09 09:51:15
【问题描述】:

我正在尝试制作一个部分视图,如下所示:

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

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

我有一个局部视图,既可用作注册表,又可用作用户信息卡;取决于用户是否登录。

由于这个局部视图必须在网站的任何地方都可见,所以我将它写在 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 中,如果我是正确的,没有控制器会对其进行操作,不是吗?

有什么建议吗?

【问题讨论】:

  • 我在我的回答中添加了一个示例,希望能描述我在回答中试图达到的目的。如果您还有其他问题,请告诉我。希望这会有所帮助。

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


【解决方案1】:

你应该看看这个以前的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>

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

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

谢谢!

【讨论】:

  • 好的,我明白了。在局部视图中有两个模型在一个更大的容器模型中。但是当我注册时,我需要看到刚刚注册玩家卡的那个玩家。根据您的建议,如果模型已经加载,我将如何加载该信息?
  • 如果我理解正确的话,当你准备视图/模型时,你应该知道在控制器中。如果您知道用户已在您的控制器中注册,则可以相应地为您的视图准备模型。如果我没有正确理解您的问题,请告诉我 - 如果是,请提前道歉。
  • 是的,这很简单。但请记住,我是从 _layout 中调用此 Html.partial,如果我是正确的,没有控制器对其进行操作,不是吗?
  • 关于编辑:所以每次加载视图(任何视图)时,都会调用 Home / Index 操作?
  • @Sergio - 不,加载的视图要么对应于调用的控制器方法(默认行为),要么对应于您在 return View("viewname", model) 时指定的方法。
【解决方案2】:

您可以这样做的一种方法是设计一个这样的 ViewModel:

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

要包括两个模型。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 由于我的局部视图是从我的 _layout 调用的,我将如何加载与登录用户相关的模型并将其传递给局部视图?
    【解决方案4】:

    这里我要逆风而行,建议大家不要在视图中做这个决定。有两个独立的视图,有自己的模型,让控制器根据用户是否登录(认证)来确定调用哪个视图。

    并不是说您正在研究的方法无法完成...您可以通过创建一个由您需要的每个视图模型组成的 ViewModel 轻松地做到这一点。不过,我仍然建议不要这样做。

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多