Asp.net core mvc ASP.NET核心MVC在部分视图/ViewComponent中提交表单

Asp.net core mvc ASP.NET核心MVC在部分视图/ViewComponent中提交表单,asp.net-core-mvc,form-submit,asp.net-mvc-partialview,asp.net-core-viewcomponent,Asp.net Core Mvc,Form Submit,Asp.net Mvc Partialview,Asp.net Core Viewcomponent,我有一个菜单和一个内容区,根据菜单中的选定项显示内容。因为用户可以更改主菜单的结构,所以我决定所有内容都在page/home/index上,并为需要显示的内容分配一个guid。我最初的想法是引入局部视图,但后来意识到ASP.NET核心不再具有渲染功能,取而代之的是ViewComponents。 所以我使用了ViewComponents,一切都很好,只是我偶然发现一种情况,我需要一个组件作为提交表单 在一个示例中:一个菜单项是菜单,它是一个显示用户列表的组件。另一个菜单项是创建新用户的组件。在创建

我有一个菜单和一个内容区,根据菜单中的选定项显示内容。因为用户可以更改主菜单的结构,所以我决定所有内容都在page/home/index上,并为需要显示的内容分配一个guid。我最初的想法是引入局部视图,但后来意识到ASP.NET核心不再具有渲染功能,取而代之的是ViewComponents。 所以我使用了ViewComponents,一切都很好,只是我偶然发现一种情况,我需要一个组件作为提交表单

在一个示例中:一个菜单项是菜单,它是一个显示用户列表的组件。另一个菜单项是创建新用户的组件。在创建用户组件时,我将有一个需要填写的表单,在成功提交时,我希望将用户重定向到显示用户列表的组件。在提交失败、错误、输入错误的情况下,我当然不想将用户重定向到用户列表

既然ViewComponents的任务是显示视图,我应该如何处理这个问题?我在寻找正确方向的指针。 我在这一领域没有什么经验,所以如果有任何帮助,我将不胜感激

更新

在Index.cshtml中:


我应该如何处理这个问题?或者更确切地说,我走对了吗?如果输入不正确,我不确定如何“返回”到我在_TestForm组件中创建的视图。

请参考以下链接:

https://andrewlock.net/an-introduction-to-viewcomponents-a-login-status-view-component/
这可能会有帮助

public class LoginStatusViewComponent : ViewComponent
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly UserManager<ApplicationUser> _userManager;

    public LoginStatusViewComponent(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
    {
        _signInManager = signInManager;
        _userManager = userManager;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        if (_signInManager.IsSignedIn(HttpContext.User))
        {
            var user = await _userManager.GetUserAsync(HttpContext.User);
            return View("LoggedIn", user);
        }
        else
        {
            return View();
        }
    }
}
public类LoginStatusViewComponent:ViewComponent
{
专用只读签名管理器\u签名管理器;
私有只读用户管理器_UserManager;
公共登录状态视图组件(SignInManager SignInManager、UserManager UserManager)
{
_signInManager=signInManager;
_userManager=userManager;
}
公共异步任务InvokeAsync()
{
if(_signInManager.IsSignedIn(HttpContext.User))
{
var user=await\u userManager.GetUserAsync(HttpContext.user);
返回视图(“LoggedIn”,用户);
}
其他的
{
返回视图();
}
}
}
我们的InvokeAsync方法非常简单。我们正在检查当前用户是否使用SignInManager登录,如果是,则从UserManager获取关联的ApplicationUser。最后,我们调用helper视图方法,传入一个要渲染的模板和模型用户。如果用户未登录,我们将在不使用模板参数的情况下调用helper视图

根据您的代码段,您可以尝试按如下方式对其进行修改:

public class TestFormViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
      if (_signInManager.IsSignedIn(HttpContext.User))
        {
       //user list display
        return View("_TestForm", new TestModelPost());
        }
      else
        {
          return View();
        }
    }
}
公共类TestFormViewComponent:ViewComponent
{
公共异步任务InvokeAsync()
{
if(_signInManager.IsSignedIn(HttpContext.User))
{
//用户列表显示
返回视图(“_TestForm”,newtestmodelpost());
}
其他的
{
返回视图();
}
}
}

请参考以下链接:

https://andrewlock.net/an-introduction-to-viewcomponents-a-login-status-view-component/
这可能会有帮助

public class LoginStatusViewComponent : ViewComponent
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly UserManager<ApplicationUser> _userManager;

    public LoginStatusViewComponent(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
    {
        _signInManager = signInManager;
        _userManager = userManager;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        if (_signInManager.IsSignedIn(HttpContext.User))
        {
            var user = await _userManager.GetUserAsync(HttpContext.User);
            return View("LoggedIn", user);
        }
        else
        {
            return View();
        }
    }
}
public类LoginStatusViewComponent:ViewComponent
{
专用只读签名管理器\u签名管理器;
私有只读用户管理器_UserManager;
公共登录状态视图组件(SignInManager SignInManager、UserManager UserManager)
{
_signInManager=signInManager;
_userManager=userManager;
}
公共异步任务InvokeAsync()
{
if(_signInManager.IsSignedIn(HttpContext.User))
{
var user=await\u userManager.GetUserAsync(HttpContext.user);
返回视图(“LoggedIn”,用户);
}
其他的
{
返回视图();
}
}
}
我们的InvokeAsync方法非常简单。我们正在检查当前用户是否使用SignInManager登录,如果是,则从UserManager获取关联的ApplicationUser。最后,我们调用helper视图方法,传入一个要渲染的模板和模型用户。如果用户未登录,我们将在不使用模板参数的情况下调用helper视图

根据您的代码段,您可以尝试按如下方式对其进行修改:

public class TestFormViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
      if (_signInManager.IsSignedIn(HttpContext.User))
        {
       //user list display
        return View("_TestForm", new TestModelPost());
        }
      else
        {
          return View();
        }
    }
}
公共类TestFormViewComponent:ViewComponent
{
公共异步任务InvokeAsync()
{
if(_signInManager.IsSignedIn(HttpContext.User))
{
//用户列表显示
返回视图(“_TestForm”,newtestmodelpost());
}
其他的
{
返回视图();
}
}
}

查看组件,就像ASP.NET MVC中前面的子操作不支持POST一样。您需要一个完整的操作来处理表单post,它需要返回一个完整的视图。本质上,你只需要更抽象地思考它

视图组件最终只是将一些HTML转储到最终响应中的一种方法。当完整响应返回给客户机时,没有关于什么是视图组件、部分视图等的概念。它只是一个HTML文档。HTML文档的一部分是表单。该表单将有一个操作,该操作最终应该是一个路由,由您的控制器操作之一处理。传统的表单post会导致整个浏览器视图发生更改,因此此操作的响应应该是完整视图或重定向到返回完整视图的操作。重定向是更合适的路径,遵循PRG模式。然后,最终返回的是该视图的责任,以确定内容是如何构造的,并酌情使用视图组件、部分等

长话短说,这实际上与视图组件没有任何关系。它所做的只是将表单代码放到页面上

对于作为布局一部分的此类表单,通常最好在表单中包含包含“返回URL”的隐藏输入。处理表单的操作,然后可以在doi之后重定向回这个URL
public class TestFormViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
      if (_signInManager.IsSignedIn(HttpContext.User))
        {
       //user list display
        return View("_TestForm", new TestModelPost());
        }
      else
        {
          return View();
        }
    }
}