如何从视图中调用我自己的 API? ASP.NETMVC

How do I call my own API from a View? ASP.NET MVC

我创建了一个 API 用于用户注册/身份验证和类似操作。 post 方法示例:

    [AllowAnonymous]
    [HttpPost("authenticate")]
    public IActionResult Authenticate([FromBody]AuthenticateModel model)
    {
        var user = _userService.Authenticate(model.Username, model.Password);

        if (user == null)
            return BadRequest(new { message = "Username or password is incorrect" });

        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, user.Id.ToString()),
                new Claim(ClaimTypes.Role, user.Role)
            }),
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        // return basic user info and authentication token
        return Ok(new
        {
            user.Id,
            user.Username,
            Token = tokenString,

        });

我现在需要我的前端来实现我的 API。所以我想从视图中调用此 API。例如,假设我想创建一个简单的登录页面:

<div class="row">
<div class="col-md-12">
    <form method="post" action="">
        <div asp-validation-summary="All" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Username"></label>
            <input asp-for="Username" class="form-control" />
            <span asp-validation-for="Username" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Password"></label>
            <input asp-for="Password" class="form-control" />
            <span asp-validation-for="Password" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-primary">Login</button>
    </form>
</div>

我现在如何调用此登录表单的身份验证 post 方法?因为我有一个控制器,它是 API 控制器,我有一个控制器,它是用户的动作控制器。

文件结构(如果需要): File structure

您可以使用 ASP.NET MVC Core Tag Helpers:

<form asp-controller="MyControllerName" asp-action="Authenticate" method="post">
    <!-- Input and Submit elements -->
</form>

调用自己的网络操作主要有两种方式:

  • 本机 HTML 表单提交。
  • AJAX

本机提交会重新加载您的整个页面。地址将更改为 URL 或您的网络操作。通常用作搜索功能,例如:

<form asp-controller="Search" asp-action="Blogs" method="get">
    <input type="text" name="question" />
    <input type="submit" />
</form>

当用户单击提交按钮提交表单时,浏览器将重定向到 /search/blogs?question=textHeInput

为了防止页面刷新,您可以使用纯JavaScript提交请求。哪个叫 AJAX.

https://en.wikipedia.org/wiki/Ajax_(programming)

例如:

// Require jQuery:
$.post('/authenticate', { "yourPropertyName" : "yourPropertyValue" }, function(response) {
    // Do something after the request. Access response like this:
    alert(response.Username);
});

并且将显示服务器响应的用户名。

由于您将 JwtBearer 与 WebAPI 一起使用,因此假设您可能会使用 Ajax 调用身份验证方法。不幸的是,您没有提供显示 ApiClass 路由约定的 class 声明,但通常它会显示为 "api/[Controller]"...如果是这种情况,您可以执行以下操作:

$("submitButton").click( 
  function authenticateUser()
  {
    $.post(
      '/api/[COntrollerName]/authentication', // URL
      $('#form").serialize(), // this is your form data as an object
      function(payload) //Response 
      {
        // do something with payload here
      }
    });
  }
);
<button type="submit" class="btn btn-primary" id="submitButton">Login</button>

您可能想要设置 <button type="button"> 以便不提交表单。将点击事件附加到该函数,以便它处理 api 调用。