Элемент управления UWP WebView не обновляется при запросе, был ли метод запроса страницы POST - PullRequest
0 голосов
/ 03 сентября 2018

Элемент управления UWP WebView имеет метод Refresh() , который отлично работает для большинства страниц, но вызывает метод непосредственно после того, как WebView был перемещен куда-то с помощью POST (например, отправка формы внутри самого WebView) Вызывает событие NavigationStarted, но никогда не выполняет обновление.

Вот несколько свернутых XAML, которые демонстрируют проблему:

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Name="Refresh" Click="Refresh_Click" Content="Refresh" />
        <WebView Grid.Row="1" Name="BrowserView" />
    </Grid>
</Page>

Вот соответствующий код:

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            BrowserView.NavigationCompleted += BrowserView_NavigationCompleted;
            BrowserView.NavigationStarting += BrowserView_NavigationStarting;
            BrowserView.Navigate(new Uri("http://localhost/test.php"));
        }

        private void Refresh_Click(object sender, RoutedEventArgs e)
        {
            BrowserView.Refresh();
        }

        private void BrowserView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
        {
            // Always called on first load and when refreshed (even for POST results)
            Debug.WriteLine($"Navigation starting for URI {args.Uri}");
        }

        private void BrowserView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
        {
            // Not called when a POST result is being refreshed
            Debug.WriteLine($"Navigation completed");
        }
    }
}

В качестве теста я создал и разместил очень маленькую страницу PHP со следующим содержимым и разместил ее по адресу http://localhost/test.php:

<!DOCTYPE html>
<html>
<head>
 <title>Test</title>
</head>
<body>
 <form method="POST">
   <p>Page loaded at <?php echo date('H:i:s') . (!empty($_POST['in']) ? ' with text "'.htmlspecialchars($_POST['in']).'"' : '') ?></p>
   <input type="text" name="in" />
   <input type="submit" />
 </form>
</body>
</html>

Как только я указываю свой WebView на эту страницу, я могу очень хорошо обновить страницу при начальной загрузке, но после отправки формы Refresh() вызывает событие NavigationStarting, но вообще не перемещается по странице (как указано в отметка времени результата теста PHP не изменяется) и никогда не вызывает соответствующее событие NavigationCompleted.

Когда ту же страницу посещают в Edge, пользователю показывается это предупреждение при попытке обновить результат POST:

The dialog Microsoft Edge shows to users when refreshing a page submitted by POST

Выбор Retry повторно отправляет данные POST на сервер, а выбор Cancel ведет себя аналогично тому, что я вижу (вообще ничего не делая). Этот диалог явно не эмулируется элементом управления UWP WebView.

Поскольку мое реальное приложение показывает пользователям кнопку обновления, мне нужна кнопка, чтобы что-то делать, независимо от того, отправили ли они недавно форму или нет, или же мне нужно отключить кнопку обновления, чтобы она не смущала пользователей, когда кнопка ничего не делает.

Прямо сейчас единственное решение, которое у меня есть (что удивительно работает, но на самом деле противно), это вызвать GoBack(), затем в обработчике NavigationCompleted немедленно вызвать GoForward().

Я мог бы согласиться на опцию, которая позволяет мне обнаружить это условие (что-то вроде WebView.CanRefresh, чтобы я мог отключить кнопку Обновить), или в худшем случае какой-то результат / исключение, которое позволяет мне сообщить пользователю, что (не) произошло и почему.

1 Ответ

0 голосов
/ 04 сентября 2018

Если я правильно понимаю ваш вопрос, вы хотите обновить страницу после отправки формы.

Если это так, вы можете проверить, была ли форма отправлена ​​в обработчик php. Пожалуйста, проверьте эту ветку: Проверка, была ли отправлена ​​форма - PHP . Затем в обработчике php вы можете вызвать метод javascript для обновления страницы, например window.location.reload().

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