Как использовать API из представления MVC в .NET Core api?

#sql-server #asp.net-mvc #asp.net-core #asp.net-core-webapi #asp.net-core-5.0

#sql-сервер #asp.net-mvc #asp.net-core #asp.net-core-webapi #asp.net-core-5.0

Вопрос:

Я создаю веб-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, я не знаю, в чем или где именно ошибка.

Комментарии:

1. вы отладили контроллер MVC и проверили ответ от API?

2. Есть ли у вас действие get для возврата представления?

Ответ №1:

проблема в том, что когда я открываю представление, даже когда API запущен, на странице появляется ошибка 405, я не знаю, в чем или где именно ошибка.

Пожалуйста, обратите внимание, что ваше действие post содержит [HttpPost] атрибут, который ограничивает соответствие только HTTP Post-запросам.

Пока вы вводите URL-адрес для доступа https://xxx/controller_name/post со стороны браузера, браузер поможет отправить HTTP-запрос Get на сервер, что приведет к ошибке 405 Method Not Allowed.

Чтобы исправить это, вы можете попробовать добавить post метод HttpGet, чтобы конечная точка поддерживала запросы метода HTTP Get, как показано ниже.

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

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

Комментарии:

1. Итак, для каждого запроса, например, PUT или DELETE, он должен иметь HttpGet ? извините, если вопрос очень глупый, но я новичок в этом.