2015-05-01 67 views
1

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

的问题是,我把我的类别列表视图中的包和必须做的

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

,即使在那些将没有使用这个列表中的每个视图。

任何解决方案?

回答

3

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

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

会议

会议是坚持数据,直到当前会话存活的方式。如果我们需要从多个控制器,操作和视图访问某些数据,则会话是存储和检索数据的方式 •会话数据永不过期。

实例下面

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 :[email protected]; 
</div> 

+0

你真的不应该从View中访问'Session'。如果您试图避免每次全局缓存机制比在每个用户的会话中为完全相同的数据集占用内存更有意义时检索数据的开销。 –

0

确定这里就是我如何得到它周围:

我为这部分单独的控制器方法和观点,并呼吁@Html.Action("SearchBar", "Home")放即在_Layout.cshtml文件中。

每次'section'被渲染时,其控制器方法被调用并且数据被获取。

相关问题