Расширение WebFormView в MVC - PullRequest
0 голосов
/ 04 марта 2009

Я хочу расширить WebFormViewEngine, чтобы я мог выполнить некоторую постобработку - я хочу, чтобы он все сделал, а затем вернул мне HTML, чтобы я мог сделать некоторые последние штрихи к нему. Это нужно сделать как View / ViewEngine, потому что мне нужен доступ к ViewData.

К сожалению, похоже, нет никакого способа вернуть Html из WebFormView и нет способа передать пользовательский HtmlTextWriter в WebFormView или ViewPage.

Конечно, есть способ сделать это? Нет * * 1005

Littlecharva

Ответы [ 3 ]

2 голосов
/ 07 марта 2009

Для этого вы можете использовать Фильтры действий. Проверьте этот учебник на asp.net/mvc. Вы хотите использовать ResultsFilter.

В качестве альтернативы вы можете переопределить виртуальный метод OnResultExecuted контроллера.

1 голос
/ 24 октября 2011

Вы можете захватить выходной получатель до того, как представление будет визуализировано, переопределив метод Render класса WebFormView. Хитрость заключается в том, что получатель вывода - это не пишущий System.IO.TextWriter, а свойство Writer viewContext Кроме того, вы должны расширить WebFormViewEngine для возврата ваших представлений.

public class MyViewEngine : WebFormViewEngine
{
    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new MyView(partialPath, null);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return new MyView(viewPath, masterPath);
    }
}    

public class MyView : WebFormView
{
    public MyView(string inViewPath, string inMasterPath) : base(inViewPath, inMasterPath) { }
    public MyView(string inViewPath) : base(inViewPath) { }

    public override void Render(ViewContext viewContext, System.IO.TextWriter writer)
    {
        //make a switch to custom output receiver
        var oldWriter = viewContext.Writer;
        viewContext.Writer = new System.IO.StringWriter();
        base.Render(viewContext, null);
        viewContext.Writer.Close();

        //get output html
        var html = ((System.IO.StringWriter)viewContext.Writer).GetStringBuilder();

        //perform processing
        html.Replace('a', 'b');

        //retransmit output
        viewContext.Writer = oldWriter;
        viewContext.Writer.Write(html);
    }
}
0 голосов
/ 04 марта 2009

Хорошо, я никогда не делал этого раньше, но я просмотрел отражатель и сборки MVC. Похоже, что вы могли бы расширить ViewPage и ViewPage и объект ViewMasterPage с вашим объектом. В вашем собственном объекте вы можете переопределить метод рендеринга и получить дескриптор HtmlTextWriter. Затем просто передайте его на базу и дайте ему это сделать. Примерно так (это не проверено и носит только теоретический характер, возможно, вам придется переопределить больше методов.) Я рекомендую использовать отражатель, чтобы увидеть, как это делается сейчас и даже как это делают другие движки представления, такие как Spark.

public class MyPage : ViewPage
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        //Do custom stuff here
        base.Render(writer);
    }
}
public class MyPage<TModel> : MyPage where TModel : class
{
}
...