由于使用 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 表单时使用不显眼的验证。
情况
我目前正在将 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 表单时使用不显眼的验证。