#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
? извините, если вопрос очень глупый, но я новичок в этом.