![](/img/trans.png)
[英]Best C# Ajax (with jquery) HTML display programming pattern/usage in asp.net
[英]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.