簡體   English   中英

ASP.NET&C#&jQuery-尋找更好的用法解決方案

[英]ASP.NET & C# & jQuery - looking for a better and usage solution

我對使用jQuery有一點問題(我確實不知道jQuery,但是我被迫使用它)。

我在頁面上使用Visual Studio 2008,帶有C#的ASP.NET Web應用程序,Telerik控件。 我也在頁面上使用SqlDataSource (連接到存儲過程)

我的頁面基於母版頁面和內容頁面,並且在內容頁面中我有多視圖。

在其中一種視圖中(在其中一種多視圖中),我為國家和城市需求制作了兩個radcombo框,例如作為父級和子級組合框的級聯下拉列表。 我使用了舊的方法,這意味着我使用了更新面板,並且在父RadComboBox(國家/地區)的SelectedIndexChange事件中編寫了以下代碼:

protected void RadcomboboxCountry_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
{
    hfSelectedCo_ID.Value = RadcomboboxCountry.SelectedValue;

    RadcomboboxCity.Items.Clear();
    RadcomboboxCity.Items.Add(new RadComboBoxItem(" ...", "5"));

    RadcomboboxCity.DataBind();
    RadcomboboxCity.SelectedIndex = 0;
}

我的子radcombo框可以用以下代碼填充,讓我告訴你如何:子SqlDataSource有一個存儲過程,該存儲過程具有一個參數,我用此行填充該參數

hfSelectedCo_ID.Value = RadcbCoNameInInsert.SelectedValue;

RadcbCoNameInInsert.SelectedValue表示國家/地區ID。

完成后,無法觸發父RadComboBox(國家/地區)的SelectedIndexChange事件,因此我不得不將AutoPostback屬性設置為true。

之后,一切正常,直到有人告訴我您可以控制radcombo框的焦點和按下(當您按下父組合框[country]上的Enter鍵時,子組合框就會獲得焦點-以及當您按下上鍵時)子radcombobox [city],父combobox [country]獲得關注-對於不想使用鼠標輸入和選擇項目的用戶)。

我告訴他這是網絡應用程序,而不是贏得形式,我們不能這樣做。 我用谷歌搜索,發現jQuery是做到這一點的唯一方法……所以我開始使用jQuery。 我用jQuery為他們兩個編寫了這段代碼:

<script src="../JQuery/jquery-1.4.1.js" language="javascript" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
    $('input[id$=RadcomboboxCountry_Input]').focus();
    $('input[id$=RadcomboboxCountry_Input]').select();

    $('input[id$=RadcomboboxCountry_Input]').bind('keyup', function(e) {
        var code = (e.keyCode ? e.keyCode : e.which);

        if (code == 13) {    -----------> Enter Key
            $('input[id$=RadcomboboxCity_Input]').focus();
            $('input[id$=RadcomboboxCity_Input]').select();
        }
    });

    $('input[id$=RadcomboboxCity_Input]').bind('keyup', function(e) {
         var code = (e.keyCode ? e.keyCode : e.which);

         if (code == 38) {       -----------> Upper Key
             $('input[id$=RadcomboboxCountry_Input]').focus();
             $('input[id$=RadcomboboxCountry_Input]').select();
         }
    });
});
</script>

此jQuery代碼有效,但父RadComboBox的autopostback=true成為問題,因為在該Telerik Skins運行之后觸發了父RadComboBox的SelectedIndexChange時,此后我失去了父組合框焦點,我們應該使用鼠標,但我們不希望這樣做。 ...

為了解決這個問題,我決定將父CB的AutoPostback設置為false並進行轉換

protected void RadcomboboxCountry_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
{
    hfSelectedCo_ID.Value = RadcomboboxCountry.SelectedValue;

    RadcomboboxCity.Items.Clear();
    RadcomboboxCity.Items.Add(new RadComboBoxItem(" ...", "5"));

    RadcomboboxCity.DataBind();
    RadcomboboxCity.SelectedIndex = 0;
}

到沒有參數的公共非靜態方法,並使用jQuery這樣調用它(我使用了父組合框的onclientchanged屬性,例如

onclientchanged = "MyMethodForParentCB_InJquery();" 

而不是selectedindexchange事件):

public void MyMethodForParentCB_InCodeBehind()
{
    hfSelectedCo_ID.Value = RadcomboboxCountry.SelectedValue;

    RadcomboboxCity.Items.Clear();
    RadcomboboxCity.Items.Add(new RadComboBoxItem(" ...", "5"));

    RadcomboboxCity.DataBind();
    RadcomboboxCity.SelectedIndex = 0;
}

為此,我閱讀了以下手冊,並逐步進行了操作:

http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=732

但這本手冊是關於靜態方法的,這是我的新問題...

當我使用類似的靜態方法時:

public static void MyMethodForParentCB_InCodeBehind()
{
    hfSelectedCo_ID.Value = RadcomboboxCountry.SelectedValue;

    RadcomboboxCity.Items.Clear();
    RadcomboboxCity.Items.Add(new RadComboBoxItem(" ...", "5"));

    RadcomboboxCity.DataBind();
    RadcomboboxCity.SelectedIndex = 0;
}

我遇到一些錯誤,並且此方法無法識別我的控件和隱藏字段...

這些錯誤之一:

錯誤2非靜態字段,方法或屬性'Darman.SuperAdmin.Users.hfSelectedCo_ID'C:\\ Javad \\ Darman 6 \\ Darman \\ SuperAdmin \\ Users.aspx.cs 231的對象引用是必需的

任何想法或有什么辦法可以用jQuery調用非靜態方法嗎?

(我知道我們不能那樣做,但是還有另一種方法可以解決我的問題嗎?)

您的問題與.NET和jQuery之間的交互有關。 基本上,如果使用jQuery在用戶界面中更改值,.NET對此一無所知。 如果使用jQuery進行ajax調用,它對.NET控件一無所知。

找到並開始實現的ajax方法是正確的方法。 但是,jQuery將進行真正的ajax調用。 您在后面的代碼中執行的所有操作都必須存在於該靜態函數中。 它可以創建對象並使用它們執行操作,但是當您在運行時輸入此函數時,將不存在任何控件(與使用updatepanel一樣,它會遍歷整個頁面的生命周期)。

因此,這樣的事情將無法正常工作:

public static void MyMethodForParentCB_InCodeBehind()
{

hfSelectedCo_ID.Value = RadcomboboxCountry.SelectedValue;
RadcomboboxCity.Items.Clear();
RadcomboboxCity.Items.Add(new RadComboBoxItem(" ...", "5"));
RadcomboboxCity.DataBind();
RadcomboboxCity.SelectedIndex = 0;

}

在上述情況下,您無權訪問任何控件,因此基本上只剩下您自己使用jQuery填充控件了。

您需要將選定的值發送到static方法,將新列表項創建為字符串,然后將其返回給ajax回調。 在jQuery ajax回調中,您必須自己將項目添加到列表中。

public static string MyMethodForParentCB_InCodeBehind( string selectedvalue )
{

     string rtrnString = SomeClass.GetValue( selectedvalue );

     return rtrnString;

} 

表示邏輯中的以下函數應檢索此結果,並使用jQuery將其添加到列表中。

function AjaxSucceeded (result)
{

     alert(result.d);

     // result.d will have the value of the string passed back from the function
     // it's up to you to populate the combobox using jQuery.

}

這樣做的副作用是.NET控件不再共享以前的相同視圖狀態。 這意味着,如果頁面執行回發操作,則在密碼隱藏框中將無法使用輸入到組合框中的新值。 您很可能甚至都無法做到這一點,因為您可能會看到視圖狀態錯誤。

你有點處境艱難。 您可能需要研究使用updatepanels,因為您將可以訪問后面代碼中的控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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