【发布时间】:2019-08-09 12:52:31
【问题描述】:
我们有一个带有一些基本输入的主窗体和一个在 Boostrap 模态对话框中呈现的局部视图:
@model CreateDonutVm
@{
ViewData["Title"] = "Create Donut";
}
<div id="homer-search-modal" class="modal" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content" id="homerSearchModalContent">
@await Html.PartialAsync("_SearchHomer.cshtml", Model.HomerSearch)
</div>
</div>
</div>
<form asp-controller="Donuts" asp-action="Create">
<fieldset class="with-legend">
<legend>Donut Details</legend>
<div class="form-row align-items-center">
@Html.LabelFor(m => m.Donut.BoughtBy, "", new {@class = "col-sm-1 col-form-label-sm"})
<div class="col-sm-2">
@Html.TextBoxFor(m => m.Donut.BoughtBy, "", new {@class = "form-control form-control-sm"})
</div>
</div>
</fieldset>
<div class="clearfix">
@if (!ViewData.ModelState.IsValid)
{
<div class="alert alert-danger" role="alert">
@Html.ValidationSummary(false, "Donut Creation failed. Please correct these errors:")
</div>
}
<button type="submit" class="btn btn-primary float-right">Save</button>
</div>
</form>
模型:
public class CreateDonutVm
{
public CreateDonutVm()
{
HomerSearch = new HomerSearchVm();
}
public HomerSearchVm HomerSearch { get; set; }
public DonutDto Donut { get; set; }
}
public class DonutDto
{
[Required]
public string BoughtBy { get; set; }
}
public class HomerSearchVm
{
[Required]
public string SearchTerm { get; set; }
}
如您所见,分部视图需要自己的模型,其中包含用户填写的搜索词,然后将其提交回控制器以查找实体列表。在局部视图中,用户选择所需的实体。然后将实体 ID 和名称推回主页上的表单中。
当用户单击主表单上的“保存”按钮时,我们不希望显示部分视图中的验证消息(这些错误在模态表单中处理)。
我已经看得很远了,但找不到一个人做到这一点的例子。
我最初假设因为部分视图呈现在包含 ValidationSummary 控件的表单之外,因此 MVC 不会评估部分中控件的状态。
但是,在提交主表单后查看 ModelState,MVC 正在评估局部视图控件并将错误放入那些局部视图控件的 ModelState.Errors 集合中。
有没有办法让 MVC 只评估主窗体中的控件而忽略部分视图中的控件?
【问题讨论】:
标签: c# asp.net-mvc validation asp.net-core razor