ASP.NET MVC 3布局ViewBag所有子视图中的数据

ASP.NET MVC 3布局ViewBag所有子视图中的数据,.net,asp.net,asp.net-mvc-3,razor,.net,Asp.net,Asp.net Mvc 3,Razor,无论子视图是什么,我们都需要将动态数据传递到布局文件。例如,我们在布局的标题中显示一些特定于用户的数据 我们如何将这些数据传递到布局视图,而不必每个操作都独立提供这些数据?我们应该使用自定义控制器,还是有更好的解决方案?看看Razor项目中标准的登录控件-这些部分视图访问用户数据-可能与您希望的完全一样 e、 g.典型的LogonPartial.cshtml可能包含: @if(Request.IsAuthenticated) { <text>Welcome <b>

无论子视图是什么,我们都需要将动态数据传递到布局文件。例如,我们在布局的标题中显示一些特定于用户的数据


我们如何将这些数据传递到布局视图,而不必每个操作都独立提供这些数据?我们应该使用自定义控制器,还是有更好的解决方案?

看看Razor项目中标准的登录控件-这些部分视图访问用户数据-可能与您希望的完全一样

e、 g.典型的LogonPartial.cshtml可能包含:

@if(Request.IsAuthenticated) {
    <text>Welcome <b>@Context.User.Identity.Name</b>!
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
    @:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}
@if(Request.IsAuthenticated){
欢迎@Context.User.Identity.Name!
[@Html.ActionLink(“注销”、“注销”、“帐户”)]
}
否则{
@:[@Html.ActionLink(“登录”、“登录”、“帐户”)]
}

我使用的策略是拥有一个基本视图模型,我的所有视图模型都是从该模型派生的。我使用一个基本控制器,不过您也可以使用一个全局过滤器,并重写OnActionExecuted。当检测到返回ViewResult的操作时,我将模型转换为基本视图模型,并从基本控制器设置模型的公共属性

全局过滤器和基本控制器之间的选择取决于多种因素。如果它真的适用于所有操作(返回视图结果),并且您不需要注入来访问某些资源,那么我可能会使用过滤器。如果您需要注入依赖项,或者您有一些控制器可以应用数据,而其他控制器不能(比如管理控制器),那么我会选择基本控制器路径。如果使用控制器,则需要记住从控制器派生

如果不希望从公共视图模型派生,也可以对ViewBag执行相同的操作。我喜欢使用强类型模型,但YMMV。

您可以在_布局文件中使用@Html.Action(“ActionName”、“ControllerName”)

以下是关于这方面的文章:

我认为,最好使用章节来解决您关注的核心问题


您可以定义部分,然后用

更新它们,如果我们必须访问默认情况下无法从上下文中访问的非用户数据,该怎么办?如果您使用的是IoC,我不久前写的一篇博客展示了一种独特的方法:您能提供任何代码链接吗?我对这一点非常陌生,理解您的答案,但不知道如何实现这一点。