Layout Mvc5将模型传递到布局页面

Layout Mvc5将模型传递到布局页面,layout,asp.net-mvc-5,controller,Layout,Asp.net Mvc 5,Controller,我有一个带有adminlte模板的MVC5站点。很好。现在我需要将一些数据传递到布局页面。我需要传递到_版面页面,与警报数量、电子邮件数量、警报列表ecc相同的信息。我阅读了关于BaseController在何处执行此操作的相同文档,即读取此数据并放入模型,或创建抽象模型并将此信息放入。但不可能一次性创建此模型(即在用户登录控制器上)并在所有请求中共享它,而不在每次控制器调用时重新创建它吗?实际上,作为一个全局单态变量。 谢谢。是的,您可以创建一个基础视图模型,并使所有模型继承它 public

我有一个带有adminlte模板的MVC5站点。很好。现在我需要将一些数据传递到布局页面。我需要传递到_版面页面,与警报数量、电子邮件数量、警报列表ecc相同的信息。我阅读了关于BaseController在何处执行此操作的相同文档,即读取此数据并放入模型,或创建抽象模型并将此信息放入。但不可能一次性创建此模型(即在用户登录控制器上)并在所有请求中共享它,而不在每次控制器调用时重新创建它吗?实际上,作为一个全局单态变量。
谢谢。

是的,您可以创建一个基础视图模型,并使所有模型继承它

public class MyModel
{
    public MyBaseClass BaseClass { get; set; }
}

public abstract class MyBaseClass
{
    public virtual string MyName
    {
        get
        {
            return "MyBaseClass";
        }
    }
}

public class MyDerievedClass : MyBaseClass
{

    public int MyProperty { get; set; }
    public override string MyName
    {
        get
        {
            return "MyDerievedClass";
        }
    }
}
唯一的问题是..默认的CreateModel进程没有注册这个Deafolt视图模型,所以global.asax是您查看它的地方


是的,您可以创建一个基础视图模型并使所有模型继承它

public class MyModel
{
    public MyBaseClass BaseClass { get; set; }
}

public abstract class MyBaseClass
{
    public virtual string MyName
    {
        get
        {
            return "MyBaseClass";
        }
    }
}

public class MyDerievedClass : MyBaseClass
{

    public int MyProperty { get; set; }
    public override string MyName
    {
        get
        {
            return "MyDerievedClass";
        }
    }
}
唯一的问题是..默认的CreateModel进程没有注册这个Deafolt视图模型,所以global.asax是您查看它的地方


使用可以从布局视图调用的ChildAction看起来是一个很好的用例

因此,首先创建一个视图模型来表示数据

public class AlertVm
{
    public int EmailCount { set; get; }
    public int NotificationCount { set; get; }
}
现在创建一个动作方法,该方法创建此对象,设置值并传递到局部视图

[ChildActionOnly]
public ActionResult Alerts()
{
    var vm = new AlertVm {EmailCount = 4, NotificationCount = 2};
    return PartialView(vm);
}
现在,您的Alerts.cshtml视图(它是我们的视图模型的强类型)可以呈现您想要的任何内容

<div>
    <p>@Model.EmailCount emails</p>
    <p>@Model.NotificationCount notifications</p>
</div>

使用这种方法,您不必担心为每个动作创建视图模型。(例如:您的about页面通常不需要视图模型)

使用可以从布局视图调用的ChildAction看起来是一个很好的用例

因此,首先创建一个视图模型来表示数据

public class AlertVm
{
    public int EmailCount { set; get; }
    public int NotificationCount { set; get; }
}
现在创建一个动作方法,该方法创建此对象,设置值并传递到局部视图

[ChildActionOnly]
public ActionResult Alerts()
{
    var vm = new AlertVm {EmailCount = 4, NotificationCount = 2};
    return PartialView(vm);
}
现在,您的Alerts.cshtml视图(它是我们的视图模型的强类型)可以呈现您想要的任何内容

<div>
    <p>@Model.EmailCount emails</p>
    <p>@Model.NotificationCount notifications</p>
</div>


使用这种方法,您不必担心为每个动作创建视图模型。(例如:您的about页面通常不需要视图模型)

因此您基本上需要一个默认视图模型,其中包含重复的属性,如电子邮件和信息…?&将此视图模型包括在所有实体类中,以便不必再次创建相同的属性(&A)。。我说的对吗?对。相同的属性。如果可能的话,我只想生成这个模型一次。所以你基本上想要一个默认的视图模型,它包含重复的属性,比如电子邮件和信息…?&将此视图模型包括在所有实体类中,以便不必再次创建相同的属性(&A)。。我说的对吗?对。相同的属性。如果可能的话,我只想生成这个模型一次。好的。但是MyBaseClass中的值每次都被设置?每次控制器呼叫?我需要相同的数据库调用,我只想执行一次。如果不想设置该值…请每次删除该设置并在控制器操作方法中添加新值OK。但这不是我想要的。我只需要和singleton一样设置一次。谢谢。但是MyBaseClass中的值每次都被设置?每次控制器呼叫?我需要相同的数据库调用,我只想执行一次。如果不想设置该值…请每次删除该设置并在控制器操作方法中添加新值OK。但这不是我想要的。我只需要和singleton一样设置一次。谢谢这是一个很好的解决方案!谢谢问题在于,在ActionResult中,我需要访问db数据(即EmailCount是entityFramework调用)。每个页面都有相同的延迟。这有什么问题?用实体框架查询就可以了,没有问题。但是,做一次查询将是最好的解决方案。尝试使用会话变量。谢谢这是一个很好的解决方案!谢谢问题在于,在ActionResult中,我需要访问db数据(即EmailCount是entityFramework调用)。每个页面都有相同的延迟。这有什么问题?用实体框架查询就可以了,没有问题。但是,做一次查询将是最好的解决方案。尝试使用会话变量。谢谢