1

我有 2 个嵌套的部分控件

用户控制1:

Html.BeginRouteForm
(
   Html.RenderPartial (path of child form)
)

子控件:

Html.LabelFor(x=>x.FirstName,"First Name")
Html.TextBoxFor(x=>x.FirstName)
...

问题:

我在主页上有 2 个此部分控件的实例。当我单击第二个实例的提交按钮时,使用 AJAX 和 JQuery 发布表单。由于 FirstName 具有必需的约束,因此表单会返回并触发 FirstName 所需的验证。问题来了:当我单击标签“名字”时,光标将焦点集中在部分表单的第一个实例的名字文本框上,而不是触发验证的第二个实例。

关于如何解决这个问题的任何建议?非常感谢!

4

1 回答 1

2

猜测一下,我会说您是重复 ID 的受害者,因为 ChildControl 的两个实例可能会生成相同的 ID 字符串。

与 ASPNET 不同,MVC 似乎在“本地”生成 ID。换句话说,幕后没有任何东西可以跟踪生成了多少“控件”,这就是允许 ASPNET 生成唯一 ID 的原因。

如果是这样,这是一个很容易解决的问题。只需将您自己的 ID 添加到 ChildControl 的每个实例,执行以下操作:

@Html.TextBox("rel_date", Model.Value.rel_date.ToSiteString(), new { @class = "date-picker", style = "width: 75px;", id = "" })

在这里,我实际上是通过在 TextBox 帮助程序调用的 html 属性参数中传入一个空 ID 值来抑制我正在生成的文本框上的 ID。您将插入一些您知道该页面唯一的 ID。

顺便说一句,您可以通过检查为页面生成的 html 来快速检查我对重复 ID 的看法是否正确。当它在 IE 中启动时,只需按 F12(无论如何在 IE9 中)。这将打开一个窗口,允许您浏览生成页面的 html。您可以阅读它来查看两个文本框的 ID 属性是否相同,这将支持我的理论。

祝你好运!

于 2012-05-08T14:28:16.340 回答