【问题标题】:How to consume an API from MVC view in .NET Core api?如何在 .NET Core api 中从 MVC 视图使用 API?
【发布时间】:2021-06-29 00:34:44
【问题描述】:

我正在构建一个 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,我不知道错误是什么或在哪里。

【问题讨论】:

  • 您是否调试过 MVC 控制器并检查 API 的响应?
  • 你有一个 get 操作来返回视图吗?

标签: sql-server asp.net-mvc asp.net-core asp.net-core-webapi asp.net-core-5.0


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 所以,对于每个请求,比如 PUT 或 DELETE,它都应该有一个 HttpGet?对不起,如果这个问题很愚蠢,但我是新手。
猜你喜欢
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2020-03-25
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多