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 以将当前 Result 转换为 ViewModelBase。
  4. 如果转换成功,那么我会使用相关数据填充 ViewModelBase 详细信息。

这是我的问题...

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

1 回答 1

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>();
于 2013-07-29T20:00:51.073 回答