部分剃刀形式的多个实例

时间:2012-05-08 10:39:17

标签: asp.net-mvc asp.net-mvc-3

我有2个嵌套的部分控件

用户控制1:

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

ChildControl:

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

问题:

我在主页上有2个部分控件实例。当我点击第二个实例的“提交”按钮时,使用AJAX& amp; JQuery的。由于FirstName具有必需的约束,因此表单将呈现为FirstName触发的必需验证。问题出现了:当我点击标签“First Name”时,光标会聚焦在第一个部分表格实例的First Name TextBox上,而不是第二个触发验证的实例。

有关如何解决此问题的任何建议? 非常感谢!

1 个答案:

答案 0 :(得分: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 attributes参数中传入一个空ID值来抑制我正在生成的文本框上的ID。您将插入一些您知道该页面唯一的ID。

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

祝你好运!