【问题标题】:Same viewbag value in multiple views多个视图中的相同 viewbag 值
【发布时间】:2015-05-01 15:40:45
【问题描述】:

所以我的_Layout.cshtml 文件中有一个搜索栏,需要一个能够过滤的所有类别的列表。

问题是我把我的类别列表放在视图包里,不得不做

List<categories> categories = db.categories.ToList();
ViewBag.categories = categories;

在每个视图中,即使在那些不会使用此列表的视图中。

有什么解决办法吗?

【问题讨论】:

    标签: c# html asp.net-mvc viewbag


    【解决方案1】:

    有点不清楚您要解决什么问题,但如果 _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

    【讨论】:

      【解决方案2】:

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

      会话

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

      示例如下所述

      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 视图。创建如下所示的剃刀视图以访问会话数据。

      @{
      Layout = null;
      

      }

      <!DOCTYPE html>
      
      <html>
      <head>
      <title>Index</title>
      </head>
      <body>
      <div>
          @{
              var CustomerInfo = (MVC3.Models.Customer) Session["Customer"];
          }
      
          Customer Name is :- @CustomerInfo.Name;
          <br />
      
          Customer Surname is :-@CustomerInfo.Surname;
      </div>
      

      【讨论】:

      • 你真的不应该从视图中访问Session。如果您试图避免每次检索数据的开销,那么全局缓存机制将比在每个用户会话中为完全相同的数据集占用内存更有意义。
      【解决方案3】:

      好的,这就是我的解决方法:

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-08
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        相关资源
        最近更新 更多