2012-06-28 2 views
0

Я хочу, чтобы манипулировать HTML, используя пользовательский двигатель вида, как это:Определить контекст RenderView в MVC3

protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance) 
{ 
    if (viewContext.Controller is MyController) 
    { 
     .. alter the html then write to writer 
    } else { 
     base.RenderView(viewContext, writer, instance); 
    } 
} 

RenderView вызывается для представления и каждый частичного вида, но я не могу понять, надежный способ чтобы определить, является ли это визуализацией внешнего вида или частичного представления.

Тип объекта writer: HttpWriter для частичного просмотра и StringWriter для внешнего вида. Это кажется плохим способом протестировать его, но пока это единственная конкретная вещь, которую я могу найти

instance указывает мне вид или частичное представление, но проверяет строку, чтобы увидеть, если я показываю частичный вид или нет, кажется хрупким.

Есть ли более прямой способ определить, является ли это частичным видом или нет?

ответ

0

Вы могли бы передать булево значение для пользовательского зрения из пользовательского вида двигателя:

public class MyRazorView : RazorView 
{ 
    private readonly bool _isPartial; 

    public MyRazorView(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable<string> viewStartFileExtensions, IViewPageActivator viewPageActivator, bool isPartial) 
     : base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, viewPageActivator) 
    { 
     _isPartial = isPartial; 
    } 

    protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance) 
    { 
     if (viewContext.Controller is MyController) 
     { 
      if (_isPartial) 
      { 
       // it's a partial 
      } 
      else 
      { 
       // it's the main view 
      } 
     } 
     base.RenderView(viewContext, writer, instance); 
    } 
} 

public class MyRazorViewEngine : RazorViewEngine 
{ 
    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     return new MyRazorView(
      controllerContext, 
      partialPath, 
      null, 
      false, 
      base.FileExtensions, 
      base.ViewPageActivator, 
      true 
     ); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     return new MyRazorView(
      controllerContext, 
      viewPath, 
      masterPath, 
      true, 
      base.FileExtensions, 
      base.ViewPageActivator, 
      false 
     ); 
    } 
} 
+0

Простой и блестящий. Я продолжал подсчет в конструкторе, чтобы убедиться, что это был первый вызов (я делаю обратные вызовы для настраиваемого контроллера), который работает, но кажется шатким. Это намного лучше. –