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 に答える