我能够在转发器中执行以下操作,它可以正常工作:
<asp:TextBox ID="txtOtherPartyName" Text='<%# Eval("Name") %>' runat="server" />
<asp:RequiredFieldValidator ID="reqLoss" ControlToValidate="txtOtherPartyName"
data-valmsg-for='<%# Container.FindControl("txtOtherPartyName").ClientID%>'
Display="Dynamic" ErrorMessage="Name of party involved is required." runat="server" />
所需验证程序中的data-valmsg-for属性使服务器控件ID正常。如何对位于页面上且不在转发器内的控件执行相同操作?我没有运气就尝试过类似的事情。
更新
所以这就是我要做的事情:
<asp:Textbox id="txtTest" runat="server" />
<asp:RequiredFieldValidator id="reqTest" data-valmsg-for=**[i want the html rendered id of "txtTest" here]** runat="server" />
答案 0 :(得分:1)
您可以将该自定义属性绑定到后面代码中控件的客户端ID。
butthead.Attributes.Add("data-custom-prop", beavis.ClientID);
答案 1 :(得分:0)
在Repeater
中您使用了数据绑定语法(<%# ... %>
),但在这种情况下不适用。您应能够设置如下属性:
data-valmsg-for='<%= TextBox1.ClientID %>'
为什么你首先要在验证器中添加自定义属性,如果你不介意我问?它通过其他手段无法实现的目的是什么?
修改强>
您是否考虑过预先在代码隐藏中构建控件ID列表并将其存储在某处?这样的事情可以作为一个起点吗?:
var controlList = Page.Validators.OfType<BaseValidator>()
.Select(v => Page.FindControl(v.ControlToValidate).ClientID).ToList();
修改强>
扩展这个想法,您可以使用JavaScriptSerializer
(System.Web.Script.Serialization
)将列表序列化为JSON:
//initialize the javascript serializer
var serializer = new JavaScriptSerializer();
//retrieve all of the validators on the page and store the client ids in a list
var controlList = Page.Validators.OfType<BaseValidator>()
.Select(v => Page.FindControl(v.ControlToValidate).ClientID).ToList();
//serialize the control id list and register the script block on the page
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "data", string.Format("var data = {0}", serializer.Serialize(controlList)), true);
根据表单的复杂程度,您可能需要创建一个递归函数来查找所有控件,但希望这能够证明这一概念。