![](/img/trans.png)
[英]Passing message in ViewBag from controller to view in ASP.Net MVC
[英]ASP.NET MVC 5 passing data from home controller to layout via ViewBag
在我HomeController.cs
我有一些数据,我需要传递给我的/Shared/_Layout.cshtml
通过ViewBag
。 但是我不知道该怎么办。
这是我的/Shared/_Layout.cshtml
@foreach (var item in ViewBag.Order)
{
<li>@item.Name [ @item.Count ]</li>
}
这是HomeController.cs
public ActionResult Index()
{
ViewBag.Order = SELECT FROM DB -> ADD TO LIST
}
不幸的是,您无权访问布局视图中的Viewbag。 但是,您可以使用:
@Html.Partial("ViewName")
调用您的基本控制器。 可能还会有更多答案,但是我相信这些可能是解决您问题的最常见方法。
(如果您需要任何帮助来实现这些解决方案之一,请给我一个信号,我将对其进行更深入的解释。)
传递内容的布局的一个相当普遍的方法,是让所有视图模型类实现一个基类 (或接口),其然后将是您_layout视图的@model。
假设您要将一些文本MyText传递给所有页面:
// My base view model class
public class ViewModelBase {
public string MyText { get; set; }
}
// Some other view model
public class MyOtherViewModel : ViewModelBase {
// other properties
}
// In the _Layout view, implement the base class
@model ViewModelBase
...
@Html.DisplayFor(m => m.MyText)
...
@RenderBody()
...
这样,您的_Layout视图可以使用ViewModelbase类的所有属性,而此后呈现的任何视图仍将具有其子视图模型(此处为MyOtherViewModel)的属性。
希望有帮助!
附带说明一下,我不建议您广泛使用ViewBags来将数据传递到MVC中的视图中,这仅仅是因为与其他方法相比,它的可维护性很低,因为它的类型不严格。 根据我的选择,与使用Viewmodels相比,ViewBags没有任何真正的好处。
或者,您可以创建从控制器继承的基本控制器,并将ViewBag变量分配给基本控制器构造函数中的列表,如下所示
public class BaseController : Controller {
public BaseController(){
ViewBag.Order = SELECT FROM DB -> ADD TO LIST
}
}
然后在其他控制器中,像这样从基本控制器继承
public class HomeController : BaseController {
}
然后,您可以为每个控制器请求分配视图包,并且视图包变量将在“布局视图”中可用。
我本人已使用此技术来显示整个网站上显示的汽车制造商列表。
作为建议,我将实现某种形式的缓存,以将对常量的调用保存到后端。
但是,如果要将功能保留在家庭控制器中,则需要对其进行重组,以便可以使用jQuery / Javascript通过Ajax调用来使用它,如@counterflux在第二点中所建议的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.