关于使用jQuery我有一点问题(我真的不知道jQuery,但我不得不使用它)。
我在我的网页上使用Visual Studio 2008,带有C#的ASP.NET Web应用程序,Telerik控件。我也在我的页面上使用SqlDataSource
s(连接到存储过程)
我的网页基于主页和内容页面,在内容页面中我有多视图。
在其中一个视图中(在其中一个多视图中)我制作了两个用于国家和城市需求的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(Country)的SelectedIndexChange
事件后无法触发,因此我强制将AutoPostback
属性设置为true。
在这样做之后,一切都很好,直到有人告诉我你能控制你的radcombo盒的焦点和关键时(当你按下父组合框[country]上的 Enter 键时,所以孩子组合框得到焦点 - 当你按下儿童radcombobox [city]上的上键时,父组合框[国家]获得焦点 - 对于不想使用鼠标输入并选择项目的用户。)
我告诉他这是网络应用程序,而不是赢取形式,我们不能这样做。我用谷歌搜索它,我发现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 \ Copy of Darman 6 \ Darman \ SuperAdmin \ Users.aspx.cs 231 13达尔曼
有什么想法或有没有办法用jQuery调用非静态方法?
(我知道我们不能这样做,但有另一种方法可以解决我的问题吗?)
答案 0 :(得分:2)
您的问题与.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自己填充控件。
您需要将所选值发送到静态方法,将新列表项创建为字符串,然后将其返回给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,因为您可以访问后面的代码中的控件。