动态创建的元素未在客户端验证
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 ,但它已经很旧了,我个人没有使用它。
我的 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