簡體   English   中英

客戶端驗證prvent通過JavaScript eval()手動回發

[英]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 == trueValidatorCommonOnSubmit結果。

現在,如果您仍然與我在一起,如以下功能所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM