Web api: Как получить значение из формы и установить его для asp-action
Собственно говоря есть метод который прекрасно работает если писать запрос вручную или с приложения:
// GET: api/contractor/showContractor/1
[HttpGet("ShowContractor/{id:int}")]
public IActionResult ShowContractor(int id)
{
var contractor = GetContractor(id).Result.Value;
return View(contractor);
}
Кнопка указанная ниже тоже прекрасно работает:
<a asp-controller="Contractor" asp-action="ShowContractor" asp-route-id="1" class="button">Показать</a>
Но я никак не могу заставить работать ее вместе с полем, т.е. в поле вводиться значение и это значение поставляется под id.
<div class="container">
<form method="get" asp-controller="Contractor" asp-action="ShowContractor">
<label>Исполнитель №</label>
<input type="number" name="id"/>
<input class="button" type="submit" value="Показать"/>
</form>
</div>
Помогите пожалуйста уже и в хвост и в гриву, а представление с методом никак не выходит.
Ответы (1 шт):
Для передачи чего-либо из форм на странице, которые может выбирать Пользователь. В представлении в первой строке кода, всегда указывается модель с которой будет работать это представление. Для вашего случая, видимо это будет модель Contractor. Так что, сначала необходимо в каком-то из представлений, создать форму, в которой заполняется Id для какого-то экземпляра объекта Contractor. Далее, необходимо создать метод типа POST, в который передается модель с нужным Id, и в нем, вызывается метод типа GET с таким экземпляром объекта. Для вашей задачи, чтобы не путаться можно изменить сигнатуры методов
public IActionResult ShowContractorGet(Contractor _contractor) { // код для извлечения объекта из БД var contractor = new Contractor(); contractor.Id = _contractor.Id; contractor.Name = "Test"; return View(contractor); }
далее Атрибут [HttpPost]
и сам метод пост, который будет вызываться из представления
public IActionResult ShowContractorPost(Contractor _contractor)
{
return RedirectToAction("ShowContractorGet", _contractor);
}
В представлении нужно явно указать, что это форма для ввода данных, добавляяя строку
form method="post"<div class="container"> <form method="post" asp-controller="Contractor" asp-action="ShowContractorPost"> <div> <label asp-for ="Id"></label> </div> <div> <input asp-for="Id" class="form-control"/> </div> <input class="button" type="submit" value="Показать" /> </form>Однако, такой подход, когда вы даете пользователю право выбирать произвольный Id, в том числе и несуществующего объекта, не самая лучшая практика. Правильнее сначала создать метод и представление к нему, в котором выводится список, всех существующих объектов. Далее по названию объекта пользователь может выбрать произвольный, существующий объект, при этом значение Id, будет скрыто от него, но доступно для передачи его значения, в случае выбора такого объекта и дальнейшей работы с ним. Именно такой подход для реализации CRUD-операций, реализован в этом репозитории, с рабочим кодом для приложения с ASP.NET Core MVC на .NET 5.
Если вы хотите использовать для решения ваших задач WEB-API, то можете посмотреть аналогичный подход в этом репозитории, с рабочим кодом, где основное front-end приложение построено на ASP.NET Core MVC, а микросервисы к нему сделаны с WEB-API для .NET 6.