如何从 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 IView
和 System.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);
}
在我的 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 IView
和 System.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);
}