Server.Execute () в ASP.NET MVC - PullRequest
       6

Server.Execute () в ASP.NET MVC

3 голосов
/ 12 октября 2009

Есть ли эквивалент ASP.Execute () в ASP.NET MVC?

Очевидно, это работает только с традиционными веб-формами .aspx страниц.

Обновление: Мне нужно захватить визуализированный HTML-код из другого действия в том же контроллере для создания PDF. Может быть, есть способ выполнить View без вывода html в поток ответов?

Ответы [ 4 ]

2 голосов
/ 13 октября 2009

Посмотрите на это решение:

Визуализация представления в виде строки

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

Edit:

Я сделал некоторые исправления, работал с рефлектором и использовал решения из предыдущих вопросов. Этот код выглядит лучше. Механизм рендеринга представлений тесно связан с HttpContext.Current, поэтому нам нужно взломать:

    /// <summary>Renders a view to string.</summary>
    public static string RenderViewToString(this Controller controller,
                                            string viewName, object viewData)
    {
        //Getting current response
        var response = HttpContext.Current.Response;
        //Flushing
        response.Flush();

        //Finding rendered view
        var view = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName).View;
        //Creating view context
        var viewContext = new ViewContext(controller.ControllerContext, view,
                                          controller.ViewData, controller.TempData);

        //Since RenderView goes straight to HttpContext.Current, we have to filter and cut out our view
        var oldFilter = response.Filter;
        Stream filter = new MemoryStream(); ;
        try
        {
            response.Filter = filter;
            viewContext.View.Render(viewContext, null);
            response.Flush();
            filter.Position = 0;
            var reader = new StreamReader(filter, response.ContentEncoding);
            return reader.ReadToEnd();
        }
        finally
        {
            filter.Dispose();
            response.Filter = oldFilter;
        } 
    }

Он должен быть легко конвертируемым, чтобы можно было визуализировать View (измените ViewEngines.Engines.FindPartialView на ViewEngines.Engines.FindView). Я не вижу лучшего решения.

0 голосов
/ 08 января 2019

Я реализовал это способом MVC, он работает со всеми типами результатов. Включая загрузку файлов.

Я создал пользовательский ActionResult ExecuteUrlResult и создал два вспомогательных метода в моем BaseController.

ExecuteUrlResult

public class ExecuteUrlResult : ActionResult
{
    public string Url { get; protected set; }
    public bool PreserveForm { get; protected set; }

    public ExecuteUrlResult(string url)
    {
        this.Url = url;
    }
    public ExecuteUrlResult(string url, bool preserveForm)
    {
        this.Url = url;
        this.PreserveForm = preserveForm;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Server.Execute(this.Url, this.PreserveForm);
    }
}

Вспомогательные методы

    protected internal ExecuteUrlResult ExecuteUrl(string url)
    {
        return new ExecuteUrlResult(url);
    }
    protected internal ExecuteUrlResult ExecuteUrl(string url, bool preserveForm)
    {
        return new ExecuteUrlResult(url, preserveForm);
    }
0 голосов
/ 07 октября 2010

Большое спасибо за ваш фрагмент кода RenderViewToString. Мне пришлось внести некоторые изменения, и я интегрировал их в наш базовый контроллер, но он работает очень хорошо.

    /// <summary>Renders a view to string.</summary>
    public string RenderViewToString(ViewResult viewResult)
    {
        //Getting current response
        //var response = HttpContext.Current.Response;
        var response = Response;
        //Flushing
        response.Flush();

        //Finding rendered view
        var view = ViewEngines.Engines.FindView(ControllerContext, viewResult.ViewName, viewResult.MasterName).View;

        //Creating view context
        var viewContext = new ViewContext(ControllerContext, view,
                                          ViewData, TempData);

        //Since RenderView goes straight to HttpContext.Current, we have to filter and cut out our view
        var oldFilter = response.Filter;
        Stream filter = new MemoryStream();
        try
        {
            response.Filter = filter;
            viewContext.View.Render(viewContext, null);
            response.Flush();
            filter.Position = 0;
            var reader = new StreamReader(filter, response.ContentEncoding);
            return reader.ReadToEnd();
        }
        finally
        {
            filter.Dispose();
            response.Filter = oldFilter;
        }
    }
0 голосов
/ 13 октября 2009

Эквивалентом Server.Execute в MVC является простое создание экземпляра нужного контроллера и выполнение метода действия.

public ActionResult EntryAction()
{
    ProductController pc = new ProductController();

    return pc.Index();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...