Forms 如何在ViewComponent中重用联系人表单?

Forms 如何在ViewComponent中重用联系人表单?,forms,validation,asp.net-core-3.1,asp.net-core-viewcomponent,view-components,Forms,Validation,Asp.net Core 3.1,Asp.net Core Viewcomponent,View Components,我想在我的项目中的多个页面上使用相同的联系人表单 我在一个名为FormInViewComponent的示例项目中尝试了它,如下所示: 控制器TestController.cs 使用Microsoft.AspNetCore.Mvc; 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用System.Threading.Tasks; 命名空间FormInViewComponent.Controllers { 公共类TestController:控

我想在我的项目中的多个页面上使用相同的联系人表单

我在一个名为
FormInViewComponent
的示例项目中尝试了它,如下所示:

控制器
TestController.cs

使用Microsoft.AspNetCore.Mvc;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
命名空间FormInViewComponent.Controllers
{
公共类TestController:控制器
{
公共IActionResult索引()
{
返回视图();
}
}
}
视图
测试
Index.cshtml
(我在本页调用了
视图组件

@model FormModel
页面内容在这里
@wait Component.InvokeAsync(“SampleForm”)
模型
FormModel.cs

使用系统;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.Linq;
使用System.Threading.Tasks;
命名空间FormInViewComponent.Models
{
公共类表单模型
{
[必需]
公共字符串名称{get;set;}
}
}
ViewComponents
SampleFormViewComponent.cs

使用FormInViewComponent.Models;
使用Microsoft.AspNetCore.Mvc;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
命名空间FormInViewComponent.ViewComponents
{
公共类SampleFormViewComponent:ViewComponent
{
公共异步任务InvokeAsync(FormModel FormModel)
{
返回等待任务。FromResult(视图(formModel));
}
}
}
视图
共享
组件
SampleForm
Default.cshtml

@model FormModel
ViewComponent在这里
样本表格


最直接的问题是,您试图在没有任何参数的情况下调用
SampleFormViewComponent
,但是
InvokeAsync()
方法需要
FormModel
参数。因此,虽然它可能能够找到您的
SampleFormViewComponent
,但它将无法执行
InvokeAsync()

FormModel
作为参数传递 要解决此问题,必须使用以下语法将
FormModel
的实例传递给
组件。InvokeAsync()
调用:

@await Component.InvokeAsync(“SampleForm”,new{formModel=new formModel()})
构建
FormModel
inline 根据您的具体需求,另一种选择是删除
formModel
参数,而是在
InvokeAsync()
方法中构造视图组件:

命名空间FormInViewComponent.ViewComponents
{
公共类SampleFormViewComponent:ViewComponent
{
公共异步任务InvokeAsync()
{
var formModel=new formModel();
返回等待任务。FromResult(视图(formModel));
}
}
}
显然,视图模型通常会有与其关联的数据。您可以从当前上下文(例如,从路由参数或查询字符串)提取该数据,或使用该信息从其他位置(例如,数据库)查找数据

处理你的表格
然而,这引发了另一个问题:您希望如何处理表单?如果您要将其发布到单独的控制器操作或web服务,这没有问题。如果您希望视图组件也能像在控制器中一样处理结果,那么您将遇到困难。值得注意的是,视图组件不提供任何类型的路由或复杂的模型绑定。因此,虽然可以使用视图组件呈现表单,但应该使用控制器或web服务处理表单。

最直接的问题是,您试图调用
SampleFormViewComponent
而不使用任何参数,但是
InvokeAsync()
方法需要
FormModel
参数。因此,虽然它可能能够找到您的
SampleFormViewComponent
,但它将无法执行
InvokeAsync()

FormModel
作为参数传递 要解决此问题,必须使用以下语法将
FormModel
的实例传递给
组件。InvokeAsync()
调用:

@await Component.InvokeAsync(“SampleForm”,new{formModel=new formModel()})
构建
FormModel
inline 根据您的具体需求,另一种选择是删除
formModel
参数,而是在
InvokeAsync()
方法中构造视图组件:

命名空间FormInViewComponent.ViewComponents
{
公共类SampleFormViewComponent:ViewComponent
{
公共异步任务InvokeAsync()
{
var formModel=new formModel();
返回等待任务。FromResult(视图(formModel));
}
}
}
显然,视图模型通常会有与其关联的数据。您可以从当前上下文(例如,从路由参数或查询字符串)提取该数据,或使用该信息从其他位置(例如,数据库)查找数据

处理你的表格 然而,这引发了另一个问题:您希望如何处理表单?如果您要将其发布到单独的控制器操作或web服务,这没有问题。如果您希望视图组件也能像在控制器中一样处理结果,那么您将遇到困难。值得注意的是,视图组件不提供