У меня есть меню и область содержимого, в которой отображается содержимое на основе выбранного элемента в меню. Поскольку пользователю разрешено изменять структуру главного меню, я решил, что все будет на странице / home / index и будет иметь идентификатор, назначенный для контента, который необходимо показать. Я начал с идеи ввести частичные представления, но понял, что ASP.NET Core больше не имеет RenderAction и был заменен ViewComponents. Итак, я использовал ViewComponents, и все работает нормально, за исключением того, что я наткнулся на ситуацию, когда мне нужен компонент в качестве формы отправки.
В качестве примера: Один пункт меню - это меню - компонент, который показывает список пользователей. Другой пункт меню - это компонент, который создает нового пользователя. При создании пользовательского компонента у меня будет форма, которую необходимо заполнить, и при успешной отправке я хочу перенаправить пользователя на компонент, который показывает список пользователей. В случае неудачной отправки, ошибки или неправильного ввода я, конечно, не хотел бы перенаправлять пользователя в список пользователей.
Поскольку задача ViewComponents - отображать представление, как мне подойти к этой проблеме? Ищу указатели в правильном направлении. У меня мало опыта в этой области, поэтому я буду благодарен за любую помощь.
ОБНОВЛЕНИЕ
В Index.cshtml:
<tbody>
@foreach (string item in Model.Components)
{
<tr>
<td>
<div class="col-md-3">
@await Component.InvokeAsync(@item)
</div>
</td>
</tr>
}
</tbody>
Это внутри области содержимого. Компоненты - это строковые имена компонентов, которые я хотел бы отображать в области содержимого (в настоящее время перечисляются один за другим).
My ViewComponent, который вызывается, когда я нажимаю на пункт меню для отображения формы:
public class TestFormViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View("_TestForm", new TestModelPost());
}
}
Мой компонент _TestForm.cshtml:
@model TestModelPost
<form asp-controller="Home" asp-action="TestPost" method="post">
<label asp-for="Name"></label>
<input asp-for="Name" /><br />
<label asp-for="Surname"></label>
<input asp-for="Surname" /><br />
<button type="submit">Go</button>
</form>
И действие TestPost вызвало:
[HttpPost]
public IActionResult TestPost(TestModelPost model)
{
// Save model data, etc
// !ModelState.IsValid -> go back to form
// Success -> go to specific id
return RedirectToAction("Index", new { id = 1 });
}
Как мне подойти к этому? Вернее, я вообще на правильном пути? Я не уверен, как я мог бы вернуться к тому представлению, которое я создал в своем компоненте _TestForm, если введенные данные были неправильными.