如何在服务器控件中使用客户端ID?

时间:2012-04-18 18:23:24

标签: asp.net

我能够在转发器中执行以下操作,它可以正常工作:

 <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" />

2 个答案:

答案 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();

修改

扩展这个想法,您可以使用JavaScriptSerializerSystem.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);

根据表单的复杂程度,您可能需要创建一个递归函数来查找所有控件,但希望这能够证明这一概念。