我一直在尝试使用ASP.NET Core中的视图组件来创建基于“小部件”的系统。我目前拥有的联系表单可以打开模式对话框,并根据他们所做的选择显示视图组件。为了简单起见,我从布局页面中按如下方式调用viewcomponent(是的,我没有使用vc:Convention atm):
@await Component.InvokeAsync("Inquiry")
然后它将通过此处调用查询表格:
public class InquiryViewComponent : ViewComponent
{
private readonly ILogger<InquiryViewComponent> _logger;
private readonly IServiceRepository _serviceRepository;
public InquiryViewComponent(ILogger<InquiryViewComponent> logger, IServiceRepository serviceRepository)
{
_logger = logger;
_serviceRepository = serviceRepository;
}
public async Task<IViewComponentResult> InvokeAsync()
{
// do stuff here like create a backing model and then return the view
return await Task.FromResult(View("~/Views/Inquiry/Inquiry.cshtml", _viewModel));
}
}
一切正常加载,并且模态对话框打开(有一个脚本可以在打开时调用模态),并具有以下内容:
@model InquiryViewModel
//modal initialization here
//modal header here
@using (Html.BeginForm("Inquiry", "Inquiry"))
{
<div class="modal-body">
<div class="container">
<div class="row mb-2">
<div class="col-md-6">
@Html.LabelFor(m => m.Inquire.FirstName, new { @class = "required" })
@Html.TextBoxFor(m => m.Inquire.FirstName, new { @class="form-control", autocomplete="given-name", required="required" })
</div>
<div class="col-md-6">
@Html.LabelFor(m => m.Inquire.LastName, new { @class = "required" })
@Html.TextBoxFor(m => m.Inquire.LastName, new { @class = "form-control", autocomplete = "family-name", required = "required" })
</div>
</div>
//OTHER FIELDS HERE
</div>
//FOOTER
}
用户提交后,如果模型无效,它将回发到我不希望的视图查询中。我确实知道它正在尝试返回表单上的页面(我可以看到发生了什么)。我也了解我可以使用客户端验证,但我的目标是构建更复杂的小部件,并且不希望使用一堆JavaScript代码。我想知道的是:如果我有一个基于表单的视图组件,并且需要服务器进行模型验证,是否可以在不呈现页面的情况下返回结果?这种实现方式对于视图组件而言是否完全不正确,还有哪些其他方法更合适?