0

次のようなカスタムビューエンジンを使用してHTMLを操作したいと思います。

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名前を教えてくれますが、文字列をチェックして部分ビューをレンダリングしているかどうかを確認するのは難しいようです。

それが部分的なビューであるかどうかを判断するためのより直接的な方法はありますか?

4

1 に答える 1

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
        );
    }
}
于 2012-06-28T16:03:18.290 に答える