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

时间:2019-09-18 15:39:59

标签: asp.net-core-mvc unobtrusive-validation

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

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

当我按Submit(提交)时,如果该金额保留为空,则该字段将在客户端上正确验证,并显示一条错误消息。

现在,用户可以使用jquery将新的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>

Cf。到动态添加的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>

记录看起来非常相似。但是,当我将必填字段留空并按Submit时,该值未在客户端上验证,并且执行涉及控制器的action方法。但是那里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" />
}

如何找到问题原因?

1 个答案:

答案 0 :(得分:0)

回答您的主要问题。添加新行后,您能否尝试执行下一个JavaScript代码

function refreshValidators(formSelector) {
    var targetForm = $(formSelector);
    targetForm.removeData('validator');
    targetForm.removeData('unobtrusiveValidation');
    targetForm.removeAttr('novalidate');
    $.validator.unobtrusive.parse(targetForm);
}

关于第二个问题,我认为您应该为其创建单独的问题,因为它与您的主要问题无关。您需要找到适当的方法来在ASP.NET Core中添加新行。对于ASP.NET MVC,我们有了下一个解决方案,该解决方案如何解决此任务http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/。谷歌搜索BeginCollectionItem之后,我发现了核心类似物solution,但它已经很老了,我没有亲自使用它。