Как открыть новое окно с потоковым документом в ASP.NET Web Forms - PullRequest
0 голосов
/ 03 января 2011

У меня есть приложение ASP.NET Web Forms. Я хочу иметь кнопку для отправки на сервер, который будет использовать мои поля в моей форме (после проверки) в качестве параметров для процесса сервера, который сгенерирует документ и отправит его обратно в браузер. Я хочу, чтобы форма обновлялась с некоторыми результатами статуса.

Каков наилучший способ достичь этого? Прямо сейчас у меня есть кнопка, создающая документ и направляющая его обратно в браузер (это документ Word, всплывающее диалоговое окно и документ Word можно успешно открыть), но страница не обновляется. 1003 *

У меня есть jQuery в моем решении, поэтому использование js не является проблемой, если это необходимо.

Ответы [ 2 ]

1 голос
/ 04 января 2011

Это было намного сложнее, чем я думал.Основная проблема заключается в открытии нового окна браузера для документа Word.Окно кратковременно всплывает, затем закрывается - документ Word не появляется.Кажется, это проблема безопасности.

Если я нажму кнопку на своей странице, я смогу отправить документ Word обратно в ответ, и появится диалоговое окно браузера, позволяющее мне открыть / сохранить / отменить, ноКонечно, моя страница не обновляется.

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

<asp:Button Text="Generate Doc" runat="server" ID="btnGenerateDoc" 
onclick="btnGenerateDoc_Click" OnClientClick="SetupPageRefresh()" />

Моя функция SetupPageRefresh выглядит следующим образом:

function SetupPageRefresh() {
    // Force the button to open a new browser window.
    form1.target = '_blank';

    // Immediately reset the form's target back to this page, and setup a poll 
    // to the server to wait until the document has been generated.
    setTimeout("OnTimeout();", 1);
}

Затем моя функция OnTimeout сбрасывает цель для формы, а затем начинает опрос веб-службы, чтобы дождаться завершения процесса на сервере.(У меня есть счетчик в моем сеансе, который я обновляю после завершения процесса.)

function OnTimeout() {
    // Reset the form's target back to this page (from _blank).
    form1.target = '_self';

    // Poll for a change.
    Poll();
}

И функция Poll просто использует функцию jjuery ajax для опроса моего веб-сервиса:

function Poll() {
    var currentCount = $("#hidCount").val();
    $.ajax({
        url: "/WebService1.asmx/CheckCount",
        data: JSON.stringify({ currentCount: currentCount }),
        success: function (data) {
            var changed = data.d;
            if (changed) {
                // Change recorded, so refresh the page.
                window.location = window.location;
            }
            else {
                // No change - check again in 1 second.
                setTimeout("Poll();", 1000);
            }
        }
    });
}

Таким образом, это делает 1-секундный опрос моего веб-сервиса, ожидая, когда счетчик сеанса изменится со значения в скрытом поле на странице.Это означает, что не имеет значения, сколько времени серверный процесс генерирует документ Word (и обновляет базу данных и т. Д.), Страница не будет обновляться, пока не будет завершено.

Когда вызов веб-службы возвращаетсяпри значении true страница обновляется с помощью оператора window.location = window.location.

Для полноты, мой веб-сервис выглядит следующим образом:

/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class WebService1 : WebService
{
    [WebMethod(EnableSession=true)]
    public bool CheckCount(int currentCount)
    {
        if (Session["Count"] == null)
            Session["Count"] = 0;
        var count = (int)Session["Count"];
        var changed = count != currentCount;

        return changed;
    }
}

Надеюсь, это поможет кому-то еще!

1 голос
/ 03 января 2011

У меня очень похожий процесс на одном из моих серверов, и способ, которым я обработал его, заключается в создании временного документа на сервере, а не в прямом эфире.Требуется немного служебного кода, чтобы привести его в порядок, но это означает, что вы можете вернуть результаты генерации и затем выполнить перенаправление на стороне клиента в сгенерированный документ в случае успеха.В моем случае я использую jQuery и AJAX для генерации документов и обновления страницы, но тот же принцип должен применяться и к подходу чисто веб-форм.

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