动态创建的元素未在客户端验证

Dynamically created elements are not validated on the client

我的 Web 应用程序中有一个 table,它是从模型中填充的,其中属性具有用于验证的属性:

    [Required(ErrorMessage = "Please enter amount!")]
    [DisplayFormat(NullDisplayText = "", ApplyFormatInEditMode = true)]
    public decimal? Amount { get; set; }

当我按下“提交”时,该字段在客户端上得到了正确验证,如果金额为空,则会显示一条错误消息。

现在用户可以使用 jquery 向 table 添加新的 TR。新记录完全模仿现有记录,例如当我检查现有 TR 的金额字段时:

<input class="form-control" type="text" data-val="true" data-val-number="The field Amount must be a number." data-val-required="Please enter amount!" id="Financials_1__Amount" name="Financials[1].Amount" value="1834.09"><span class="text-danger field-validation-valid" data-valmsg-for="Financials[1].Amount" data-valmsg-replace="true"></span>

比照。到动态添加的TR的同一个字段:

<input class="form-control" type="text" data-val="true" data-val-number="The amount must be a number." data-val-required="Please enter amount!" id="Financials_77e9f261-010a-4c7c-ae50-e3f6587a8c4e__Amount" name="Financials[77e9f261-010a-4c7c-ae50-e3f6587a8c4e].Amount" value="33"><span class="text-danger field-validation-valid" data-valmsg-for="Financials[77e9f261-010a-4c7c-ae50-e3f6587a8c4e].Amount" data-valmsg-replace="true"></span>

记录看起来很相似。然而,当我将必填字段留空并按下提交时,该值未在客户端验证,并且执行进入控制器的操作方法。但是 ModelState.IsValid 是错误的。这是我的第一期。

操作方法如下:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit(int contractorId, ContractorDetailsDto dto)
    {
        if (ModelState.IsValid)
        {
  ...
        }

        return View(_contractorRepository.GetContractorDetailsViewModelByDto(dto));
    }

由于我们的 ModelState 无效,因此加载了相同的视图。错误显示在验证摘要中,但不在具有无效值的字段下。这是第二期。

我的观点是:

@section Scripts {
<partial name="_ValidationScriptsPartial" />
}

如何找到问题的原因?

回答您的主要问题。您可以在添加新行

后尝试执行下一个javascript 代码吗
function refreshValidators(formSelector) {
    var targetForm = $(formSelector);
    targetForm.removeData('validator');
    targetForm.removeData('unobtrusiveValidation');
    targetForm.removeAttr('novalidate');
    $.validator.unobtrusive.parse(targetForm);
}

关于你的第二个问题,我认为你应该为它创建单独的问题,因为它与你的主要问题无关。您需要找到如何在 ASP.NET 核心中添加新行的正确方法。对于 ASP.NET MVC,我们有下一个解决方案如何解决此任务 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ . After googling BeginCollectionItem I found core analog ,但它已经很旧了,我个人没有使用它。