如何从 RazorViewEngine 中创建的 IView 访问 WebViewPage 实例?

How to access to the WebViewPage instance from created IView in RazorViewEngine?

在我的 Web MVC 应用程序中,我定义了一个自定义 RazorViewEngine,如下所示:

    public class MyRazorEngine : RazorViewEngine
    {
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            var tmp = base.CreateView(controllerContext, viewPath, masterPath);

            // *** here some action i want do by (tmp as MyWebPageBase).
            // *** for example access to the 'SomeField' value which assigned into (tmp as MyWebPageBase).

            return tmp;

        }
   }

我定义我的视图继承 MyWebViewPage.cs:

public abstract class MyWebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
    public int SomeField{ get; set;};
}

现在,我的问题是我无法访问 MyWebPageBase 来自 RazorViewEngine class 的渲染视图。怎么办?

这取决于你想做什么,在哪里做。

base.CreateView(controllerContext, viewPath, masterPath) 

returns IViewSystem.Web.Mvc.WebViewPage 没有实现 IView,所以你不能在它们之间转换,而且这在管道中为时已晚。

您可以子类化 RazorView 并覆盖 RenderView 方法,因为您可以在下面看到它在其实例参数中传递了一个 WebViewPage 但这对于您尝试做的任何事情来说都太晚了:

  protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            WebViewPage webViewPage = instance as WebViewPage;
            if (webViewPage == null)
            {
                throw new InvalidOperationException(
                    String.Format(
                        CultureInfo.CurrentCulture,
                        MvcResources.CshtmlView_WrongViewBase,
                        ViewPath));
            }

或者您可以实现自己的 IViewPageActivator 并将其插入解析器:

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}

Brad Wilson introduces that here : View Page Activator