2012-04-18 70 views
0

我能夠做一箇中繼器下面,它工作得很好:如何在服務器控件中使用客戶端ID?

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

中呈現的服務器控件ID就好了required驗證的數據valmsg換屬性。我怎樣才能對坐在頁面上並且不在中繼器內的控件執行相同的操作?我嘗試了類似的東西,但沒有運氣。

更新

所以這裏就是我希望做的正是:

<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

你試圖讓不在中繼器控制的客戶端ID或者你想轉發的控件之一的客戶端ID綁定到另一個控制中繼器之外? – CheckRaise 2012-04-18 18:38:06

+0

我試圖獲取不在中繼器中的控件的客戶端ID。我只是使用中繼器作爲例子,我可以從一箇中獲取客戶端ID,這讓我希望我可以對不在中繼器內的服務器控件執行相同的操作。 – Mike 2012-04-18 18:39:46

+0

好的。應該只是<%= ControlName.ClientID%>確保您在標記中聲明它時爲控件提供了一個ID。 – CheckRaise 2012-04-18 18:41:31

回答

1

您可以將該自定義屬性綁定到後面代碼中的控件的客戶端ID。

butthead.Attributes.Add("data-custom-prop", beavis.ClientID); 
+0

太棒了!非常感謝。 – Mike 2012-04-18 19:23:11

+0

沒問題。但是,它確實打擊了我的好奇心,爲什麼不能在如果有人知道答案,那麼這將是錦上添花! – CheckRaise 2012-04-18 22:38:02

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); 

根據表單的複雜程度,您可能需要創建一個遞歸函數來查找所有控件,但希望這可以展示這個概念。

+0

使用該方法會將標記呈現爲純文本。這是一個漫長的故事,但我這樣做的原因是因爲我正在展示一個非常自定義的驗證用戶界面,其中包含一個帶有用戶訪問控件的鏈接的摘要以及顯示錯誤消息的工具提示。我使用data-valmsg-for屬性來掃描錯誤並構建自定義顯示。 – Mike 2012-04-18 18:32:39

+0

它是如何在上面的代碼示例中呈現的?不應該在'data-valmsg-for'屬性中輸出'ClientID'嗎? – 2012-04-18 18:39:57

+0

它只是呈現爲純文本:」style =「color:Red; display:none;」>需要損失。 Mike 2012-04-18 18:41:18