用于将公共数据传递给MVC4.5中的_layout.cshtml的模式

时间:2013-07-29 17:56:39

标签: asp.net-mvc-4

我正在尝试提供将数据传递到_layout.cshtml页面的最佳模式。

我正在创建一个公共基类,所有视图特定模型都是从这个基类派生出来的。这个基类将被我的_layout.cshtml识别,并用于填写用户的详细信息并在标题中加载正确的图像等。例如,这里有一个片段。

public abstract class ViewModelBase
{
    public string Username { get; set; }
    public string Version { get; set; }
}

在_layout.cshtml的顶部,我有......

@model MyProject.Web.Controllers.ViewModelBase

我需要一个公共区域来保存模型所需的信息,并计划使用以下模式...

  1. 每个动作方法都会创建并保存从中派生的模型 ViewModelBase。
  2. 操作完成。
  3. 我创建一个ActionFilterAttribute并重写OnActionExecuted来强制转换 ViewModelBase的当前结果。
  4. 如果转换成功,我会使用相关数据填充ViewModelBase详细信息。
  5. 以下是我的问题......

    1. 使用ActionFilterAttribute(OnActionExecuted)是一个很好的模式,我想做什么?
    2. 我无法看到如何从HttpActionExecutedContext获取动作中创建的结果。这是怎么做到的?

1 个答案:

答案 0 :(得分:3)

我遵循相同的方法并使用我的其他viewModel继承的基本ViewModel类。

然后,我有一个所有控制器继承的基本控制器。在那里,我有一个方法来处理初始化视图模型:

protected T CreateViewModel<T>() where T : ViewModel.BaseViewModel, new()
{
    var viewModelT = new T {
                        HeaderTitle = "Welcome to my domain",
                        VisitorUsername = this.VisitorUsername,
                        IsCurrentVisitorAuthenticated = this.IsCurrentVisitorAuthenticated,

                        //...
                    };

    return viewModelT;
}

然后在每个控制器上,当我想创建视图模型时,我只需调用基本控制器的方法:

var vm = base.CreateViewModel<MyPageCustomViewModel>();