我们有一个带有一些基本输入的主窗体,并且在Boostrap Modal对话框中呈现了一个局部视图:
@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不会评估局部视图中控件的状态。
但是,在提交主表单后,MVC会查看ModelState,它正在评估部分视图控件并将错误放入ModelState.Errors集合中,用于这些部分视图控件。
有没有办法让MVC只评估主要形式的控件而忽略部分视图中的控件?
答案 0 :(得分:1)
这与form
标记中的内容无关;重要的是模型中的内容。提交时,HomerSearch
的任何值都不会被发布,因为它们的形式不是发布的形式,但是,它们仍然是模型的一部分,并且如果存在必填字段,这样您的模型将因此无法通过验证。
也就是说,仅当参考道具为非null时,才会验证参考属性(例如HomeSearch
道具)上的属性。该应该是默认值,但是您很可能正在视图模型构造函数中对其进行更新,或者通过在prop上使用默认值来对其进行更新。简而言之,如果您不希望它参与验证,则应该停止该操作。但是,根据您其余的代码,这可能是不可能的。如果其他情况取决于将此设置为实例,那么您将破坏该代码。
总之,这里的整个方法可能是错误的。很有可能应该将其分解为您的视图模型,而应通过视图组件将其包含在页面中。
答案 1 :(得分:0)
这个问题不是很清楚,因为您没有显示模型和验证错误...
但是,当您提交表单并传递Model
时,该模型必须有效...假设HomerSearch
的必填字段尚未填写,则您的Model
无效,因此不应提交...如果HomeSearch
不在表单内,则它将不包含在您的模型中...但是如果您的Model
需要{{ 1}},那么您将收到验证错误...
听起来您需要重构设计...可以:
HomeSearch
Donut
验证...