由于使用 ASCX 作为 MVC-View 的 NamingContainer ID,客户端验证中断

Client validation broken due to NamingContainer ID using ASCX as MVC-View

情况

我目前正在将 WebForms 应用程序迁移到 MVC。一些旧控件大量使用 WebForms 表单验证框架(旧验证器,例如 RequiredFieldValidator),目前我依赖于该特定行为。

完全重写这些控件的成本太高了。但我能做的是将它们迁移到 ASCX-MVC-Views 中。这允许我在 cshtml-files.

中通过 Html.Partial 等使用旧的验证器和控件。

问题

当我这样做时,由于表单控件的错误客户端 ID,我在生成的验证代码中遇到各种 JS 语法错误:

<script type="text/javascript">
//<![CDATA[
var 1_ctl05 = document.all ? document.all["1_ctl05"] : document.getElementById("1_ctl05");
...

这里的问题是,变量不能以数字 (1) 开头。数字 1 是命名容器通常会生成一些前缀的地方。

经过检查,我注意到 ASCX 控件的 ID 确实是“1”,验证器及其父项的 NamingContainer.ID 属性也是如此。

现在,我可以 'fix' 通过实施 PageLoad-Event 并将 this.ID 设置为以字符开头的内容来解决这个问题。但我觉得我要么在这里做错了(我可以在某个地方更正确地设置 ID 吗?)或者这是一个错误。

有什么建议吗?

虽然仍然不完全确定为什么命名容器是空的,但我注意到可以通过使用 jQuery 不显眼的验证完全避免错误(和讨厌的)全局 JavaScript 代码。

所以 "fix" 将在使用 MVC 和 ASCX/ASPX 表单时使用不显眼的验证。