C# ASP.Net MVC核心验证摘要始终显示部分视图错误
我们有一个带有一些基本输入的主窗体和一个在Boostrap模式对话框中呈现的局部视图:C# ASP.Net MVC核心验证摘要始终显示部分视图错误,c#,asp.net-mvc,validation,asp.net-core,razor,C#,Asp.net Mvc,Validation,Asp.net Core,Razor,我们有一个带有一些基本输入的主窗体和一个在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-
@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>
如您所见,局部视图需要它自己的模型,其中包含用户填充的搜索词,然后提交回控制器以查找实体列表。在局部视图中,用户选择所需的实体。然后将实体ID和名称推回主页上的表单中
当用户单击主窗体上的“保存”按钮时,我们不希望显示来自部分视图的验证消息(这些错误在模式窗体中处理)
我已经看了很多地方,但是找不到一个例子来证明有人做到了这一点
我最初假设,因为部分视图是在包含ValidationSummary控件的表单之外呈现的,所以MVC不会评估部分中控件的状态
但是,在提交主窗体后查看ModelState时,MVC正在评估部分视图控件,并将错误放入这些部分视图控件的ModelState.errors集合中
有没有办法让MVC只评估主窗体中的控件而忽略部分视图中的控件?这个问题不是很清楚,因为您没有显示模型和验证错误 但是当您提交表单并通过
模型
时,模型必须有效。。。假设HomerSearch
中有一个必填字段尚未填写,则您的型号
无效,因此不应提交。。。如果HomeSearch
不在表单中,则它不会包含在您的模型中。。。但是,如果您的模型
需要来自HomeSearch
的一些值,那么您将得到验证错误
听起来你需要重构你的设计。。。你可以:
- 不要将整个模型传递给控制器,只需传递
Donut
- 删除
验证李>HomerSearch
- 使用自定义/条件验证规则
- 这与
表单中的内容无关
标签;你的模型里有什么很重要。提交时,HomerSearch
的所有值都不会发布,因为它们不是发布的表单,但它们仍然是模型的一部分,如果其中有必填字段,则模型将因此而失败
也就是说,只有当引用属性为非空时,才会验证引用属性(如HomeSearch
prop)上的属性。这应该是默认值,但很可能是在视图模型构造函数中或通过在属性上使用默认值来更新它。简单地说,如果您不想让它参与验证,就应该停止。但是,基于代码的其余部分,这可能是不可能的。如果有其他东西依赖于将其设置为实例,那么您将破坏该代码
长话短说,这里的整个方法可能是错误的。更有可能的是,这应该从视图模型中分离出来,而是通过视图组件包含在页面中。局部视图包含另一个表单中搜索控件的标记,用户在文本框中输入搜索短语,单击搜索,显示实体网格,然后选择实体。然后,所选实体的ID和名称被推回主页上的表单中。因此,在我看来,视图组件在这里并不合适,因为我们需要局部视图有一个模型,我们可以将搜索短语和实体结果集绑定到该模型。关于如何解决这个问题,你还有其他建议吗?
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; }
}