ASP.Net MVC Core ValidationSummary始终显示部分视图错误

时间:2019-03-19 04:04:50

标签: c# asp.net-mvc validation asp.net-core razor

我们有一个带有一些基本输入的主窗体,并且在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只评估主要形式的控件而忽略部分视图中的控件?

2 个答案:

答案 0 :(得分:1)

这与form标记中的内容无关;重要的是模型中的内容。提交时,HomerSearch的任何值都不会被发布,因为它们的形式不是发布的形式,但是,它们仍然是模型的一部分,并且如果存在必填字段,这样您的模型将因此无法通过验证。

也就是说,仅当参考道具为非null时,才会验证参考属性(例如HomeSearch道具)上的属性。该应该是默认值,但是您很可能正在视图模型构造函数中对其进行更新,或者通过在prop上使用默认值来对其进行更新。简而言之,如果您不希望它参与验证,则应该停止该操作。但是,根据您其余的代码,这可能是不可能的。如果其他情况取决于将此设置为实例,那么您将破坏该代码。

总之,这里的整个方法可能是错误的。很有可能应该将其分解为您的视图模型,而应通过视图组件将其包含在页面中。

答案 1 :(得分:0)

这个问题不是很清楚,因为您没有显示模型和验证错误...

但是,当您提交表单并传递Model时,该模型必须有效...假设HomerSearch的必填字段尚未填写,则您的Model无效,因此不应提交...如果HomeSearch不在表单内,则它将不包含在您的模型中...但是如果您的Model需要{{ 1}},那么您将收到验证错误...

听起来您需要重构设计...可以:

  • 不要将整个模型传递给控制器​​,只需传递HomeSearch
  • 删除Donut验证...
  • 使用自定义/条件验证规则