Razor Page Method RedirectToPage вызывает действие, но не загружает страницу (Нет MVC) - PullRequest
1 голос
/ 31 марта 2020

У меня есть проект с несколькими страницами Razor. Первый - это вход в систему, где при отправке я вызываю этот метод.

        public RedirectToPageResult OnPostLogin()
        {

            string salt; // grab the unique salt we stored on the database
            string hashedPassword;
            using (var conn = new SqlConnection(_config.GetConnectionString("UserDBContext")))
            {
                salt = conn.Query<string>(GetDBSalt(), new // grabs the salt from the database 
                {
                    @Email = Email
                }).FirstOrDefault();

                if (salt != null)
                {
                    hashedPassword = PasswordHash.Hash(Password, Convert.FromBase64String(salt)); // hashes the password and salt to compare against the database password
                }
                else
                {
                    hashedPassword = "";
                }

                var result = conn.Query<Guid>(CheckUserSql(), new
                {
                    @Email = Email, // ditto below 
                    @Password = hashedPassword // checks if the hashed password matches the password we have on the database 
                }).FirstOrDefault();
                var resultString = result.ToString();
                if (resultString != "00000000-0000-0000-0000-000000000000")
                {
                    //Response.Redirect($"/CardPage/{resultString}");
                    return RedirectToPage("CardPage", "Card",  new { id = resultString });
                }
                else
                {
                    return RedirectToPage("LogIn");
                }
            }
        }

Затем переходим на страницу cs html CardPage, где вызывается этот метод OnGet.

        public void OnGetCard(string id)
        {                        
            using (var conn = new SqlConnection(_config.GetConnectionString("UserDBContext")))
            {
                var cards = conn.Query<string>(GetUserSql(), new
                {
                    @Id = id
                }).FirstOrDefault();
                this.HttpContext.Session.SetString("Id", id);
                CardsSelected = cards;
            }            
        }

Это прекрасно работает, он перемещает идентификатор на следующую страницу, и я могу делать то, что мне нужно на этой странице. Но когда я пытаюсь сделать то же самое на CardPage с помощью этого метода OnPost. Этот OnPost вызывается из метода AJAX.

public RedirectToPageResult OnPost([FromBody] Cards cards)
        {
            var urlId = HttpContext.Session.GetString("Id");
            var cardString = cards.cards;
            using (var conn = new SqlConnection(_config.GetConnectionString("UserDBContext")))
            {
                conn.Execute(SetCardsSql(), new
                {
                    @Cards = cardString,
                    @Id = urlId
                });
            }
            return RedirectToPage("HierarchyPage", "Build", new { id = urlId });           
        }

И этот метод OnGet

public void OnGetBuild(string id)
        {
            using (var conn = new SqlConnection(_config.GetConnectionString("UserDBContext")))
            {
                var cards = conn.Query<string>(GetUserSql(), new
                {
                    @Id = id
                }).FirstOrDefault();
                this.HttpContext.Session.SetString("Id", id);
                CardsSelected = ParseCardsSelected(cards);
            }
            string slotHTML;
            int slotID = 1;
            // create the rows of the pyramid and insert its slots
            for (int currentRowNumber = 1; currentRowNumber <= MAX_ROWS; currentRowNumber++)
            {
                slotHTML = "";
                for (int n = 1; n <= currentRowNumber; n++, slotID++)
                {
                    // generates slot HTML and assigns an unique ID to each slot
                    slotHTML += string.Format(CARD_SLOT_HTML, slotID);
                }
                Rows += string.Format(SLOT_ROW_HTML, currentRowNumber, slotHTML);
            }
            Rows = new string(Rows.Where(c => !char.IsWhiteSpace(c) || c.Equals(' ')).ToArray());            
        }

Метод вызывается и выполняется, затем переходит на страницу cs html, где У меня есть настроенная модель. Все это выполняется правильно, но страница не загружается в браузере . Я искал несколько часов подряд, чтобы найти решение, но я не могу найти ничего с подобной проблемой. У меня есть временное решение, взяв URL, который должен быть загружен, и загрузив его вручную, и это работает таким образом.

Напомним, первые два метода работают, вторые два метода не работают. Во второй последовательности методы вызываются в OnGet, но страница не загружается в представление. При вводе URL-адреса вручную, страница загружается в представление правильно. Войдите -> CardPage работает, CardPage -> HierarchyPage не работает.

Я обновлю этот вопрос с большим количеством кода, если это необходимо.

1 Ответ

0 голосов
/ 31 марта 2020

При использовании Ajax вы должны перенаправить на другую страницу и передать параметр со стороны клиента в функции обратного вызова в случае успеха:

$.ajax({
    ...
}).done(function (data) {
    window.location.replace(data.redirectUrl);

})

Сторона сервера вернет Json результат с параметром:

public ActionResult OnPost([FromBody]Cards cards)
{

    ...
    return new JsonResult(new { redirectUrl = Url.Page("HierarchyPage", "Build", new { id = urlId }) });
}
...