如何在 .NET Core api 中从 MVC 视图中使用 API?

How to consume an API from MVC view in .NET Core api?

我正在构建一个 Web API,我想通过 MVC 视图使用它。 API 控制器用于插入用户数据,MVC 控制器用于创建视图。我一直在寻找信息,这就是我能够利用这些信息做的事情。

因此,API 控制器只是通过存储过程将数据插入数据库,我已经使用 Postman 进行了测试并且工作正常:

[Route("api/[controller]")]
[ApiController]

public class UserController : ControllerBase
{
    [HttpPost]
    public IActionResult post(Models.Request.UserModel model)
    {
        using (Models.AdminOrchardContext db = new Models.AdminOrchardContext())
        {
            Models.UserModel oUsuar = new Models.UserModel();

            Models.OrchardTable tOrchard = new Models.OrchardTable();

            oUsuar.Name = model.Name;
            oUsuar.Email = model.Email;
            tOrchard.OrchardLocation = model.OrchardLocation;

            var uName = new SqlParameter("@name", oUsuar.Name);
            var uEmail = new SqlParameter("@email", oUsuar.Email);
            var hOrchardLocation = new SqlParameter("@OrchardLocation", tOrchard.OrchardLocation);

            var idUserReg = db.Usuarios.FromSqlRaw("Exec UserAndOrchardInsert @name, @email" +
                "@OrchardLocation",
                new[] { uName, uEmail, hOrchardLocation});

            db.SaveChanges();

        }
        return Ok();
    }
 }

添加视图的 MVC 控制器,从这里 API 与视图上的用户数据一起使用:

    [HttpPost]
    public IActionResult post(Models.Request.User model)
    {
        HttpClient hc = new HttpClient();
        hc.BaseAddress = new Uri("https://localhost:44325/api/User");

        var addRecToDB = hc.PostAsJsonAsync<Models.Request.User>("User", model);

        addRecToDB.Wait();

        ViewBag.message = "Ok!";

        return View();
    }

和视图:

@model Huerbog.Models.Request.User

@{
    ViewData["Title"] = "post";
 }

<h1>User registration</h1>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Email" class="control-label"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <h4>Orchard-related field</h4>
            <div class="form-group">
                <label asp-for="OrchardLocation" class="control-label"></label>
                <input asp-for="OrchardLocation" class="form-control" />
                <span asp-validation-for="OrchardLocation" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
    <h4>@ViewBag.message</h4>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
     @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

现在的问题是,当我打开视图时,即使 API 是 运行,页面上也会出现错误 405,我不知道具体是什么或在哪里错误。

the problem is that when I open the view, even when the API is running, on the page appears the Error 405, I don't know what or where exactly is the error.

请注意,您的操作 post 包含 [HttpPost] 属性,该属性限制仅匹配 HTTP Post 个请求。

当您输入URL从浏览器端访问https://xxx/controller_name/post时,浏览器会帮助向服务器发出HTTP Get请求,这会导致405 Method Not Allowed 错误。

要修复它,您可以尝试添加一个 HttpGet post 方法来使端点支持 HTTP Get 方法请求,如下所示。

[HttpGet]
public IActionResult post()
{
    return View();
}

[HttpPost]
public IActionResult post(Models.Request.User model)
{
    //...