从 ASP.NET 核心视图代码中获取 JSON

Get a JSON from an ASP.NET Core view code

在 ASP.NET Core 2.2 应用程序中,我有一个用户页面,我需要在该页面上获得密码重置 link

下面是我的代码,似乎不起作用

EditUser.cshtml代码

<script>
    var getUserLink = function () {
        var actionLink = "@Url.Action("ResetPassword", user)";
        $.getJSON(actionLink, function (data) {
            $("#resetLink").html(data["resetLink"]);
        });
    };
</script>

EditUser.chtml.cs代码

public class EditUserModel : PageModel
{
   /// ...

    public async Task<JsonResult> ResetPassword(ApplicationUserModel user)
    {
        var appUser = new ApplicationUser
        {
            UserName = user.Email,
            Email = user.Email,
            DisplayName = user.Name,
            OrganizationID = user.OrganizationID,
            EmailConfirmed = true
        };
        var code = await userManager.GeneratePasswordResetTokenAsync(appUser);
        var callbackUrl = Url.Page("/Account/ResetPassword",
            pageHandler: null,
            values: new { code },
            protocol: Request.Scheme);
        return new JsonResult(new { resetLink = callbackUrl });
    }
}

我的意思是,当我从cshtml页面点击"Obtain"按钮时,会询问JSON,但是代码没有进入ResetPasword函数在 cshtml.cs 文件中。问题出在哪里?

在 razor 页面上,您使用 "Handlers" 调用对您当前所在的 razor 页面的请求。

因此,如果您想发出获取请求,则必须重命名您的方法以遵循特定模式:

public class EditUserModel : PageModel
{
    public async Task<JsonResult> OnGetResetPasswordAsync(ApplicationUserModel user)
    {
        /* ...*/
    }
}

你的javascript现在变成了:

var getUserLink = function () {
    var actionLink = "./?handler=ResetPassword";
    $.getJSON(actionLink, function (data) {
        $("#resetLink").html(data["resetLink"]);
    });
};

类似于此:如果你想发出一个 POST 请求,你需要命名你的处理程序方法 OnPostFooOnPostFooAsync 和类似的每个剩余的 HttpVerbs

如果你想发出 POST 请求,你必须做更多的提升。在这里阅读:https://www.thereformedprogrammer.net/asp-net-core-razor-pages-how-to-implement-ajax-requests/