【问题标题】:ASP.Net MVC Core ValidationSummary always shows Partial view errorsASP.Net MVC Core ValidationSummary 总是显示部分视图错误
【发布时间】: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


    【解决方案1】:

    这与form 标签中的内容无关;重要的是您的模型中的内容。当您提交时,HomerSearch 的任何值都不会发布,因为它们不在发布的表单中,但是,它们仍然是模型的一部分,如果有必填字段这样一来,您的模型将因此验证失败。

    也就是说,只有当引用属性为非 null 时,才会验证引用属性(如 HomeSearch 属性)上的属性。这 应该 是默认值,但很可能您是在视图模型构造函数中更新它,或者在道具上使用默认值。简单地说,如果您不希望它参与验证,您应该停止它。但是,根据您的其余代码,这可能是不可能的。如果其他东西取决于 this 设置为一个实例,那么您将破坏该代码。

    总而言之,这里的整个方法可能是错误的。很可能,这应该从您的视图模型中分离出来,而是通过视图组件包含在页面中。

    【讨论】:

    • 局部视图包含另一个表单中搜索控件的标记,其中用户在文本框中输入搜索短语,单击搜索,显示实体网格,然后选择实体。然后将所选实体的 ID 和名称推回主页上的表单中。所以在我看来,视图组件在这里不合适,因为我们需要部分视图有一个模型,我们可以将搜索短语和实体结果集绑定到。对于如何解决这个问题,您还有其他建议吗?
    【解决方案2】:

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

    但是当您提交表单并通过Model 时,模型必须有效...假设HomerSearch 有一个未填写的必填字段,您的Model 无效,因此应该不提交...如果HomeSearch不在表单中,那么它不会包含在您的模型中...但是如果您的Model需要来自HomeSearch的一些值,那么您将收到验证错误.. .

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

    • 不要把整个Model传给控制器,直接传Donut
    • 删除HomerSearch验证...
    • 使用自定义/条件验证规则

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 2019-10-15
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2021-02-07
      • 2020-12-06
      相关资源
      最近更新 更多