Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 我可以使用两个模型的局部视图吗?_Asp.net Mvc 3_Model_Partial Views - Fatal编程技术网

Asp.net mvc 3 我可以使用两个模型的局部视图吗?

Asp.net mvc 3 我可以使用两个模型的局部视图吗?,asp.net-mvc-3,model,partial-views,Asp.net Mvc 3,Model,Partial Views,我试图提出一个部分观点,其作用如下: 当用户未登录时,显示注册表 当用户登录时,向我显示用户信息 我有一个局部视图,它既是注册表,又是用户信息卡;取决于用户是否登录 由于此部分视图必须在网站的任何位置可见,因此我在MVC3应用程序的_布局区域中编写了它: <body> <div id="wrapper"> <div id="top"> <p id="onlinecount">7890 Perso

我试图提出一个部分观点,其作用如下:

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

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

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

由于此部分视图必须在网站的任何位置可见,因此我在MVC3应用程序的_布局区域中编写了它:

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

7890个虚拟人物

进入者注册

@Html.Partial(“_RegisterPartial”) @RenderBody()
基本上,如果用户未登录,我需要在该部分显示一个表单。但是,如果他登录(通过cookie或其他方式),我应该加载他的信息模型,以便显示他的帐户的数据

这就是我被困的地方。我不知道如何加载此用途的模型。因为这是在_布局中,如果我是正确的,没有控制器对其进行操作,不是吗


有什么建议吗?

你应该看看这篇与你类似的文章

您应该在页面的单个模型中包含注册和用户信息。(因此,您的问题的答案是您的页面只有一个模型。但是您的模型可以由其他对象组成——每个局部视图一个对象。)

因此,正如您在链接中看到的,用户的部分视图仅使用页面模型中与其相关的对象

我想这应该对你有帮助。希望这有帮助!祝你好运

更新:很抱歉耽搁了您的时间,但这里有一个示例(大量代码)可能会有所帮助:

型号: 我创建了一个抽象视图模型,其中始终包含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);
    }
}
查看--\u Layout.cshtml: 请注意,模型中的第一行设置了“我的布局”模板的模型对象。我从控制器获得这个视图模型,我可以在_布局(或其他模板)中引用它。我在这里做的不多,除了获取一个局部视图(_RegStuff)并将我的模型中的RegInfo传递给它(在控制器中设置):

@model mvcapapplication1.Models.RegModelViewModelBase
@模型名称
@Html.Partial(“_RegStuff”,Model.RegInfo)
@RenderBody()
查看——\u RegInfo.cshtml: 非常简单,但我再次设置了这个局部视图希望传入的模型类型

@model MvcApplication1.Models.Registration
<div>User Name = @Model.UserName</div>
@model mvcapapplication1.Models.Registration
用户名=@Model.UserName
查看--Index.cshtml: 同样,设置模型并在我的索引视图中使用它

@model MvcApplication1.Models.MainPageViewModel

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

<h2>@Model.Title</h2>
<h3>Display Name = @Model.UserInfo.DisplayName</h3>
@model mvcapapplication1.Models.MainPageViewModel
@{
Layout=“~/Views/Shared/_Layout.cshtml”;
}
@模型名称
显示名称=@Model.UserInfo.DisplayName
因此,在整个过程中,我可以参考控制器中的模型集

我希望这能解释我想表达的意思。如果没有,我可以相应地更新


谢谢

实现这一点的一种方法是设计如下的ViewModel:

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

包含两个模型。

您可以创建一个新类“ViewModel”来容纳这两个模型,

或者您可以将两个或其中一个模型都放在ViewBag中

我将在这里违背规则,建议您不要在视图中做出此决定。有两个独立的视图,具有各自的模型,并让控制器根据用户是否登录(验证)来确定调用哪个视图


这并不是说你正在寻找的方法无法实现。。。通过制作一个由所需的每个视图模型组成的视图模型,可以很容易地做到这一点。尽管如此,我还是建议不要这样做。

好吧,我明白了。在局部视图的较大容器模型中有两个模型。但当我注册的时候,我需要看到那个刚刚注册玩家卡的玩家。根据您的建议,如果模型已加载,我将如何加载该信息?如果我理解正确,在准备视图/模型时,您应该在控制器中知道这一点。如果知道用户已在控制器中注册,则可以相应地为视图准备模型。如果我没有正确理解你的问题,请告诉我-如果我没有正确理解,请提前道歉。是的,这很简单。但是请记住,我是从_布局中调用这个Html.partial的,如果我是正确的,没有控制器对它进行操作,没有?关于编辑:所以每次加载视图(任何视图)时,都会调用Home/Index操作?@Sergio-否,加载的视图要么对应于调用的控制器方法(默认行为)或者由您在
返回视图(“viewname”,model)
时指定的部分视图。由于我的部分视图是从我的布局调用的,我如何加载与登录用户相关的模型并将其传递给部分视图?我在回答中添加了一个示例,希望能够描述我在回答中试图获得的内容。如果你还有其他问题,请告诉我。希望这有帮助。
public class ViewModel
{
    public PlayerCard playerCard { get; set; }
    public RegisterModel registerModel { get; set; }
}