ASP.NET& C#& jQuery - 寻找更好的使用解决方案

时间:2010-02-14 11:08:18

标签: c# asp.net jquery web-applications

关于使用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调用非静态方法?

(我知道我们不能这样做,但有另一种方法可以解决我的问题吗?)

1 个答案:

答案 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,因为您可以访问后面的代码中的控件。