C# 在多个视图中使用相同的viewbag值

C# 在多个视图中使用相同的viewbag值,c#,html,asp.net-mvc,viewbag,C#,Html,Asp.net Mvc,Viewbag,因此,我在我的\u Layout.cshtml文件中有一个搜索栏,它需要一个能够过滤的所有类别的列表 问题是,我把我的类别列表放在查看包中,必须这样做 List<categories> categories = db.categories.ToList(); ViewBag.categories = categories; List categories=db.categories.ToList(); ViewBag.categories=类别; 在每个视图中,甚至在那些不使用此

因此,我在我的
\u Layout.cshtml
文件中有一个搜索栏,它需要一个能够过滤的所有类别的列表

问题是,我把我的类别列表放在查看包中,必须这样做

List<categories> categories = db.categories.ToList();
ViewBag.categories = categories;
List categories=db.categories.ToList();
ViewBag.categories=类别;
在每个视图中,甚至在那些不使用此列表的视图中


有什么解决方案吗?

有点不清楚您要解决什么问题,但是如果
\u Layout.cshtml
需要从每个控制器传递它所需的值,或者您会在运行时面临异常风险,因为ViewBag是空的

一种解决方案是创建基类控制器并重写
OnResultExecuting
方法

public class BaseController : Controller
{
    protected override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // In case you're doing any AJAX calls there's no sense in
        // incurring the overhead of filling the ViewBag.
        if(!Request.IsAjaxRequest)
        {
            List<categories> categories = db.categories.ToList();
            ViewBag.categories = categories;
            base.OnResultExecuting(filterContext);
        }
    }
}
公共类BaseController:控制器
{
ResultExecuting上受保护的覆盖无效(ResultExecutingContext filterContext)
{
//如果您正在进行任何AJAX调用,那么
//导致填充ViewBag的开销。
如果(!Request.IsAjaxRequest)
{
List categories=db.categories.ToList();
ViewBag.categories=类别;
base.OnResultExecuting(filterContext);
}
}
}

现在只需确保应用程序中的每个控制器都继承自
BaseController

您试图解决的问题有点不清楚,但是如果
\u Layout.cshtml
需要从每个控制器传递它所需的值,或者您在运行时面临异常风险,因为ViewBag是空的

一种解决方案是创建基类控制器并重写
OnResultExecuting
方法

public class BaseController : Controller
{
    protected override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // In case you're doing any AJAX calls there's no sense in
        // incurring the overhead of filling the ViewBag.
        if(!Request.IsAjaxRequest)
        {
            List<categories> categories = db.categories.ToList();
            ViewBag.categories = categories;
            base.OnResultExecuting(filterContext);
        }
    }
}
公共类BaseController:控制器
{
ResultExecuting上受保护的覆盖无效(ResultExecutingContext filterContext)
{
//如果您正在进行任何AJAX调用,那么
//导致填充ViewBag的开销。
如果(!Request.IsAjaxRequest)
{
List categories=db.categories.ToList();
ViewBag.categories=类别;
base.OnResultExecuting(filterContext);
}
}
}

现在只需确保应用程序中的每个控制器都继承自
BaseController

如果要从多个控制器传递数据,为什么不使用会话呢

会议

会话是将数据持久化到当前会话处于活动状态的方法。如果我们需要从多个控制器、操作和视图访问一些数据,那么会话就是存储和检索数据的方法 •会话数据永不过期

下面描述示例

public class CustomerController : Controller
{
    public ActionResult Index()
    {
        Customer Obj = new Customer();

        Obj.Name = "Sourav ";

        Obj.Surname = "Kayal";

        Session["Customer"] = Obj;
        return View();
    }

}
}

Create a view to display data
当我们使用MVC3应用程序时,我们可以创建Razor视图。创建如下所示的razor视图以访问会话数据

@{
Layout = null;
}


指数
@{
var CustomerInfo=(MVC3.Models.Customer)会话[“Customer”];
}
客户名称为:-@CustomerInfo.Name;

客户姓氏为:-@CustomerInfo.name;

如果要从多个控制器传递数据,为什么不使用会话

会议

会话是将数据持久化到当前会话处于活动状态的方法。如果我们需要从多个控制器、操作和视图访问一些数据,那么会话就是存储和检索数据的方法 •会话数据永不过期

下面描述示例

public class CustomerController : Controller
{
    public ActionResult Index()
    {
        Customer Obj = new Customer();

        Obj.Name = "Sourav ";

        Obj.Surname = "Kayal";

        Session["Customer"] = Obj;
        return View();
    }

}
}

Create a view to display data
当我们使用MVC3应用程序时,我们可以创建Razor视图。创建如下所示的razor视图以访问会话数据

@{
Layout = null;
}


指数
@{
var CustomerInfo=(MVC3.Models.Customer)会话[“Customer”];
}
客户名称为:-@CustomerInfo.Name;

客户姓氏为:-@CustomerInfo.name;

好的,下面是我如何解决这个问题的:

我为该部分创建了一个单独的控制器方法和视图,并调用了
@Html.Action(“SearchBar”,“Home”)
,并将其放入
\u Layout.cshtml
文件中


每次呈现“section”时,都会调用其控制器方法并获取数据。

好,下面是我如何处理它的:

我为该部分创建了一个单独的控制器方法和视图,并调用了
@Html.Action(“SearchBar”,“Home”)
,并将其放入
\u Layout.cshtml
文件中


每次呈现“section”时,都会调用其控制器方法并获取数据。

您确实不应该从视图中访问
会话。如果您试图避免每次检索数据时的开销,那么全局缓存机制将比占用每个用户会话中相同数据集的内存更有意义。您确实不应该从视图中访问
session
。如果您试图避免每次检索数据时的开销,那么全局缓存机制比在每个用户的会话中为完全相同的数据集占用内存更有意义。