剃刀页面方法RedirectToPage调用操作,但不加载页面(无MVC)

时间:2020-03-31 01:49:23

标签: c# asp.net-core redirect razor razor-pages

我有一个带有几个Razor页面的项目。第一个是在提交后我称之为此方法的日志。

2C

然后转到cshtml页面CardPage,在该页面上调用此OnGet方法。

        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");
                }
            }
        }

这工作得很好,它将id移到下一页,我可以在此页面上做我需要做的事情。但是,当我尝试使用此OnPost方法在CardPage上执行完全相同的操作时。此OnPost是通过AJAX方法调用的。

        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;
            }            
        }

这个OnGet方法

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 });           
        }

该方法被调用并执行,然后转到在其中设置了模型的cshtml页面。所有这些都能正确执行,但是页面无法在浏览器中加载。我一直在搜寻数小时以寻找解决方案,但找不到任何类似问题。我有一个临时的解决方法,方法是获取应该加载的网址,然后手动加载它,这样工作。

概括地说,前两种方法有效,后两种方法无效。在第二个序列中,这些方法在OnGet中调用,但是页面未加载到视图中。手动输入url时,页面将正确加载到视图中。登录-> CardPage有效,CardPage-> HierarchyPage不起作用。

如果需要,我将使用更多代码更新此问题。

1 个答案:

答案 0 :(得分:0)

如果使用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 }) });
}