【发布时间】:2018-10-12 12:03:29
【问题描述】:
我有一个菜单和一个内容区域,它根据菜单中的选定项目显示内容。由于允许用户更改主菜单的结构,因此我决定将所有内容都放在 /home/index 页面上,并为需要显示的内容分配一个 guid。我开始的想法是引入局部视图,但意识到 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>
这是在内容区域内。 Components 是我想在内容区域中显示的组件的字符串名称(目前一个接一个地列出)。
当我单击菜单项以显示表单时将调用我的 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 组件中创建的视图。
【问题讨论】:
标签: asp.net-core-mvc form-submit asp.net-mvc-partialview asp.net-core-viewcomponent