繁体   English   中英

ASP.NET MVC 5通过ViewBag将数据从家庭控制器传递到布局

[英]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。 但是,您可以使用:

  • 对基本控制器中的方法的PartialView调用只需定义一个基本控制器即可,它是所有控制器的父级。 顺便说一下,这对于某些错误处理也很方便。 在您的布局中,使用@Html.Partial("ViewName")调用您的基本控制器。
  • 使用Ajax调用在布局视图中使用javascript来执行返回所需数据的控制器功能。
  • 请改用会话变量,因为会话变量可以在布局视图中访问。

可能还会有更多答案,但是我相信这些可能是解决您问题的最常见方法。

(如果您需要任何帮助来实现这些解决方案之一,请给我一个信号,我将对其进行更深入的解释。)

传递内容的布局的一个相当普遍的方法,是让所有视图模型类实现一个基类 (或接口),其然后将是您_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM