[英]Client-Side validation prvent Manually Postback by JavaScript eval()
使用GetPostBackEventReference時,我遇到一些回發問題。 這是場景 :
我有一個javascript模態彈出對話框,並在此模態對話框中有一個用於選擇事物的按鈕(這不是 asp:button控件)
單擊此JavaScript對話框HTML按鈕后,它將通過javascript:eval()方法調用MS AJAX Web服務調用。 MS AJAX Web服務調用是動態生成的。 所以代碼是這樣的:
var serviceCall = svcCall + "(" + parameters + ")"; //dynamically generate the MS AJAX web service call here
eval(serviceCall);
//use eval to trigger the MS AJAX web service call
眾所周知,在完成MS AJAX Web服務之后,您可以定義一個回調函數來處理完成:
function OnComplete(result, userContext, methodName) {
//force to call postback manually
eval($(userContext[0]).val());
//close the javascript dialog here
}
正如我之前提到的,MS AJAX Web服務調用是動態構建的,並且在構建MS AJAX Web服務調用時,它將傳遞一個包含回發值的userContext(即“ __doPostBack('ctl00 $ ContentPlaceHolder1 $ btnSelectUser' ,'') “,因此在調用javascript eval()時 ,它會模擬一個asp:button單擊回發。
userContext [0]基本上保留一個asp:hidden字段的ClientID,並且在Page_Load事件期間設置隱藏字段的值:
protected void Page_Load(object sender, EventArgs e)
{
btnSelectUser.ValidationGroup = "popupSelect";
btnSelectUser.CausesValidation = false;
this.hdnBtnPostback.Value = Page.ClientScript.GetPostBackEventReference(btnSelectUser, string.Empty, false);
}
如您所見,這就是我使用GetPostBackEventReference將asp:button(即btnSelectUser)的Click事件綁定到asp:hiddenfield的方法,並將registerForEventValidation參數設置為false。 我還嘗試使用其他ValidationGroup並將CausesValidation設置為false ,但沒有希望。 :(
總之,我將asp:button的Click PostBackEventReference (即__doPostback(....))綁定到asp:hidden字段的Value屬性,並使用javascript eval()評估此隱藏字段的值,以便手動觸發回發。
ps btnSelectUser是一個asp:button控件,用於調出javascript模式對話框。
好的,這是問題所在:
在同一頁面上,有一些asp:validator,例如和,以及of coz,當頁面出錯時,該驗證器和標注將顯示給用戶。 例如,當用戶未填寫任何內容並提交表單時,ValidatorCalloutExtender將顯示氣球並告訴用戶。 想象一下,此ballon / validatorCalloutExtender之一現在出現在屏幕上方。
然后,您單擊btnSelectUser(asp:按鈕)以顯示javascript模態對話框,然后在對話框中添加一些用戶,並在該模態對話框中單擊SELECT按鈕后,就會觸發如上所述的MS AJAX Web服務,並且此Web服務完成后,它將eval()asp:hidden字段的值(即__doPostback(...))......並手動執行回發。
但是,由於顯示了validatorCalloutExtender氣球,因此無法以這種方式觸發回發,但是當我關閉ballon / validatorCalloutExtender時,使用eval()進行手動回發就可以了。 更奇怪的是,當顯示氣球時,我第一次單擊該模式對話框內的SELECT按鈕時,不會觸發回發,但是,如果我再次執行相同的操作(即打開javascript對話框,並且選擇一些用戶,然后再次單擊“選擇”按鈕。 它能夠進行手動回發...。我不明白為什么第一次不起作用。
這真的使我發瘋,希望這里的任何人都能提供幫助,我們將不勝感激。 非常感謝你們。 :)
祝你今天愉快。 希望很快能收到大家的來信。
當您調用__doPostBack(eventTarget, eventArgument)
將觸發表單提交:
如果WebForm_OnSubmit();
將繼續執行此發自帖子WebForm_OnSubmit();
返回true。
WebForm_OnSubmit
結果取決於ValidatorOnSubmit
結果,而后者又取決於
如果Page_ValidationActive == true
則ValidatorCommonOnSubmit
結果。
現在,如果您仍然與我在一起,如以下功能所示:
function ValidatorCommonOnSubmit() {
Page_InvalidControlToBeFocused = null;
var result = !Page_BlockSubmit;
if ((typeof(window.event) != "undefined") && (window.event != null)) {
window.event.returnValue = result;
}
Page_BlockSubmit = false;
return result;
}
ValidatorCommonOnSubmit
的結果取決於Page_BlockSubmit
,因此阻止回發的唯一方法是Page_BlockSubmit == true
,它與驗證標注無關。
我無法模擬您的情況,但是如果您可以發布完整的代碼示例,它將幫助我找到問題所在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.