Получить post data в xamarin

Форум Форумы ГЛАВНЫЙ ФОРУМ Получить post data в xamarin

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Автор
    Записи
  • #79
    oparish249oparish249
    Участник

    Здравствуйте,
    в мобильном приложении, написанном на xamarin нужно сделать так, чтобы при заполнении данных в форме регистрации на сайте https://lkabit.dvgups.ru/user/… in%2Flogin, открытом через WebView при нажатии на кнопку “Зарегистрироваться”, логин и пароль сохранялись в переменные в приложении Xamarin, был написан, следующий код

    using CutWebView.ViewModels;
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
                using System.Text;
                using System.Threading.Tasks;
                using Xamarin.Forms;
                using Xamarin.Forms.Xaml;
     
    namespace CutWebView.Views
    {
        [XamlCompilation(XamlCompilationOptions.Compile)]
        public partial class AboutPage : ContentPage
        {
            public AboutPage(AboutViewModel pg)
            {
                InitializeComponent();
     
                Entrance();
            }
       
            bool trans = false;
            string admuser_name;
            string admuser_passw;
            private async Task Entrance()
            {
     
     
                if (trans)
                {
                    // Пользователь авторизован
                    webView.Source = "https://lkabit.dvgups.ru/user/sign-in/login?_referrer=%2Fsite%2Findex";
                    await webView.EvaluateJavaScriptAsync($"document.getElementById('loginform-identity').value = '{user_name}';");
                    await webView.EvaluateJavaScriptAsync($"document.getElementById('loginform-password').value = '{user_passw}';");
                    await webView.EvaluateJavaScriptAsync("document.getElementsByName('login-button')[0].click();");
                }
                else
                {
                    // Перенаправление на страницу регистрации
                    webView.Source = "https://lkabit.dvgups.ru/user/sign-in/abiturient-signup?_referrer=%2Fuser%2Fsign-in%2Flogin";
     
                    LoadWebView();
                }
            }
            private void LoadWebView()
            {
                webView.Source = "https://lkabit.dvgups.ru/user/sign-in/abiturient-signup?_referrer=%2Fuser%2Fsign-in%2Flogin";
     
                webView.Navigated += async (s, e) =>
                {
                    string jsCode = @"
                        document.getElementById('signup-button').addEventListener('click', function() {
                            var email = document.getElementById('abiturientsignupform-email').value;
                            var password = document.getElementById('abiturientsignupform-password').value;
                            var data = { email: email, password: password };
                            window.xamarin_data = JSON.stringify(data);
                        });
                    ";
                    await webView.EvaluateJavaScriptAsync(jsCode);
                };
            }
     
            private async void LoginButtonClicked()
            {
                // Извлекаем данные из webView
                string jsCode = "window.xamarin_data;";
                string jsonData = await webView.EvaluateJavaScriptAsync(jsCode);
     
                if (!string.IsNullOrEmpty(jsonData))
                {
                    // Парсим JSON данные
                    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonData);
                    string email = data["email"];
                    string password = data["password"];
     
     
     
                    // Сохраняем данные в базе данных
                    admuser_name = email;
                    admuser_passw = password;
                    if (!(email is null && password is null))
                        trans = true;
                    await Entrance();
                }
            }
        }
     
    }

    Однако приложение даже не запускается с ним, в чем может быть проблема?

    #162
    MixBotMixBot
    Участник

    Проблема в том, что метод LoginButtonClicked() нигде не вызывается. Вы добавили код для перехвата данных из формы, но привязали его к событию Navigated WebView. Это событие срабатывает один раз при загрузке страницы, до того как пользователь вообще что-то ввел. В результате переменная trans всегда false, а нужная функция никогда не выполняется.

    Кроме того, скорее всего краш происходит из-за race condition: вы пытаетесь выполнить JavaScript до полной загрузки DOM. Решение навесить обработчик нажатия кнопки не через Navigated, а через инъекцию JavaScript после загрузки страницы с ожиданием готовности элементов. И главное добавьте вызов LoginButtonClicked() в нужное место, например, на событие клика кнопки в XAML или через WebView.Navigated после того, как форма регистрации полностью отрисовалась и пользователь ввел данные.

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Для ответа в этой теме необходимо авторизоваться.