Использование Response Flush в WebControl - PullRequest
2 голосов
/ 23 марта 2012

Я хотел бы использовать какой-то пошаговый рендеринг в веб-контроле, вот пример (работает не так, как предполагалось)

public class Price : WebControl
{

    protected override void Render(HtmlTextWriter output)
    {
        HttpResponseBase response = new HttpResponseWrapper(new HttpResponse(output));

        //Panel basePanel = new Panel() { ID = "basePanel" };
        //Controls.Add(basePanel);
        //var loaderImage = LoaderAnimation();
        //Controls.Add(loaderImage);

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("aaa "));
        response.Flush();

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("bbb "));
        response.Flush();

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("ccc "));

        base.RenderContents(output);
    }
}

Это должно отображаться при каждом сбросе.Может быть, это ужасная техника, но я хотел бы получить несколько советов по этому поводу.

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Ваш подход, вероятно, не будет работать, как ожидалось. Если вы хотите пошаговый рендеринг (я не спрашиваю , почему ), вам следует разрешить что-то вроде AJAX .

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

Если вы хотите показать что-то вроде процесса более продолжительного процесса на сервере, пусть другой фоновый поток выполнит эту работу, и пусть клиент каждые X секунд опрашивает обновления. JSON и AJAX - ваши друзья, и вы можете показывать пользователю медленно растущую страницу / контент.

Это дает дополнительный эффект, что вы можете сначала отобразить целую страницу (то есть действительный HTML, включая HTML-тег конца), а затем обновить части в середине HTML-страницы.

1 голос
/ 23 марта 2012

Чтобы сделать это так, как вы пытаетесь, вам нужно визуализировать элементы управления с помощью (возможно) вызова .ToString ().Затем вызовите response.Write (yourString) перед вызовом response.Flush ().

Подход, который упоминает Абель, IMO, лучше.

В этом сообщении в блоге указывается, что вам необходимо вызвать ответ. Дважды нажмите ... это может работать с тем, что выделает.Когда мне нужно было делать подобные вещи, я использовал подход Абеля.

http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/08/improve-your-asp-net-website-user-experience-flush-down-your-partial-response.aspx

...