2016-04-27 39 views
2

我想確定從客戶端元素中刪除類並在ViewState中保留該刪除的正確方法。例如,我有一個自定義驗證器的表單。自定義驗證器將確定一個或多個字段具有無效輸入。然後,它會添加一個CSS類的元素,這樣它會顯示爲紅色:ASP Web窗體從ViewState中刪除類客戶端

TextBox_UserName.CssClass += " error"; 

在客戶端我有一個的onkeyup函數,將刪除類,這樣當用戶開始在字段中輸入它追溯到默認樣式:

<asp:TextBox ID="TextBox_UserName" runat="server" onkeyup="clearError(event, this)" /> 

JavaScript函數很簡單:

function clearError(event, elem) { 
    if (event.keyCode != 9 && event.keyCode != 16 && event.keyCode != 13) 
     $(elem).removeClass('error'); 
} 

這種運作良好,但我遇到的問題是這樣的;比如說用戶輸入一個清除錯誤類的值,然後他們改變表單上的另一個控件的值,從而導致回發,當表單在回發後重新加載時,錯誤類返回到TextBox_UserName控件上。我假設這是因爲類是通過代碼隱藏添加的,因此保存在ViewState中。

有沒有一種方法可以刪除或更新元素的類客戶端,並有這種變化反映在ViewState?

我唯一能想到的就是向代碼隱藏添加邏輯來處理這個問題,但是我使用的表單有很多字段,所以這並不理想。我猜想另一個選擇是使用telerik AjaxManager,以便只有引起後貼的字段受到回發的影響,但這也不是很理想。我希望有一個更好或更有效的方式來做我正在嘗試使用JavaScript來完成的事情。我沒有找到解決方案的運氣,因爲我發現所有關於如何更改ViewState都會導致錯誤(我不想刪除它)。

編輯:我選擇了這個解決方案:

在我的自定義的驗證方法,我從可能受到影響的所有控制清除錯誤類。然後我檢查每個字段是否有效,然後將錯誤類添加到未通過檢查的字段中。然後,我更新隱藏字段的值以指示驗證發生在表單上。

在該處理觸發回發的控件的事件的方法,我檢查是否出現驗證,如果有,我打個電話給:

Page.Validate(); 

這將再次觸發我的自定義驗證並且由於它會首先清除錯誤類別,因此它會更新用戶尚未修復的字段的css類別,而只保留固定字段。

+2

退一步,重新考慮你在做什麼。您正在使用驗證程序,但您正在干擾其工作流程。也許有一種方法可以正確使用它們,因此不必編寫額外的代碼來保持工作。 – Alexander

+0

感謝您的輸入。我不確定你的意思。我只是試圖對未通過驗證的元素進行樣式設置,同時允許用戶修復問題,然後清除指示存在問題的樣式,同時在ViewState中保留該樣式,以便將來的回發不會導致錯誤風格回來。您能否詳細說明我如何幹擾驗證器的工作流程,以便我可以有更好的理解,使我能夠提出更好的解決方案?我編輯了我的問題來解釋我是如何解決它的,但也許這不是最好的方法。 –

+1

這就是我的意思。驗證人應該照顧樣式。當你開始「干涉」時,你將離開他們工作的預期方式。通常,爲了安全起見,我會在自定義驗證器的_and_客戶端驗證背後編寫代碼。那你應該沒事的。 – Alexander

回答

1

的確,您無法在客戶端更改視圖狀態。如何將所有導致帖子的控件放回更新面板?這樣,只有這些控件在回發期間受到影響。就個人而言,我更喜歡在jQuery中使用AJAX函數來進行部分後貼,因爲它的重量更輕。但是,由於您使用的是Web窗體,如果您不熟悉jQuery AJAX,更新面板將是一個快速解決方案。

另一種選擇是將文本框的狀態保存在隱藏字段中。然後,服務器代碼將知道應用於文本框的類。

+1

這些都是很好的解決方案。我想避免在UpdatePanels/AjaxPanels中包裝單個控件(我正在使用Telerik控件的項目)。主要原因是因爲整個表單已經包裝在一個AjaxPanel中,所以我不想分解它。我選擇使用隱藏字段,但採用與您的建議不同的方式,因爲我認爲這需要較少的更改。我編輯了我的問題來解釋我所做的。 –