0

我能够在中继器中执行以下操作,并且效果很好:

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

2 回答 2

1

您可以在后面的代码中将该自定义属性绑定到控件的客户端 ID。

butthead.Attributes.Add("data-custom-prop", beavis.ClientID);
于 2012-04-18T19:12:14.983 回答
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);

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

于 2012-04-18T18:28:40.947 回答