使用AJAX和PageMethod通过另一个下拉列表填充下拉列表

时间:2013-04-16 20:16:33

标签: c# javascript asp.net ajax

陷入一个奇怪的问题,希望这里的专家能够提供帮助。 当下拉列表 ddlCountry 中的值发生变化时,我正在尝试填充下拉列表 ddlStates 。我不想使用 OnSelectedIndexChanged 事件下拉列表和 AutoPostBack 属性。

因此,我将 ScriptManager 实例从工具箱的AJAX扩展部分删除到Default.aspx页面,并将 EnablePageMethods 属性设置为true。 接下来,我为ddlCountry编写了一个名为 onchange 的事件,并调用了名为 ddlCountry_Changed()的Javascript函数。

在ddlCountry_Changed()中,我试图将名为populateStatesinDefault()的服务器端方法称为 PageMethods.populateStatesinDefault()

控件进入服务器端函数。要使PageMethods正常工作,我们需要在方法上添加[System.Web.Services.WebMethod()],我们需要将该方法声明为static

在静态方法中,我们不能直接调用非静态成员,我们需要进行对象引用。由于我的所有控件都在部分类_Default中,因此我创建了此部分类的对象,并尝试通过此对象访问下拉列表控件。

但令我惊讶的是,我收到了一个N​​ullReference异常。通过partial class obj访问时,控件ddlCountry显示为null。** 以下是我的代码:

Default.aspx的:

    <head>
    <script language="javascript" type="text/javascript">
    debugger
        function ddlCountry_changed() {
            PageMethods.populateStatesinDefault(onsuccess);
            //alert('hii');
        }
        function onsuccess() {
            alert('success');
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h2> Let's populate DropDowns using AJAX without AutoPostBack</h2>

        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
        </asp:ScriptManager>
            <asp:DropDownList ID="ddlCountry" runat="server" CssClass="DropDown" onchange="ddlCountry_changed()">
            </asp:DropDownList>
            <asp:DropDownList ID="ddlStates" CssClass="DropDown" runat="server">
            </asp:DropDownList>
</body>

Default.aspx.cs:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DAL obj = new DAL();
        DataTable dt = obj.populateCountry();
        ddlCountry.DataSource = dt;
        ddlCountry.DataTextField = dt.Columns[1].ToString();
        ddlCountry.DataValueField = dt.Columns[0].ToString();
        ddlCountry.DataBind();
      }
    [System.Web.Services.WebMethod()]
    public static void populateStatesinDefault()
    {
            _Default defObj = new _Default();
            **int country = int.Parse(defObj.ddlCountry.SelectedItem.Value)**;//NullReference error over here
            DAL obj2 = new DAL();
            DataTable dt = obj2.populateStates(country);
            defObj.ddlStates.DataSource = dt;
            defObj.ddlStates.DataTextField = dt.Columns[1].ToString();
            defObj.ddlStates.DataValueField = dt.Columns[0].ToString();
            defObj.ddlStates.DataBind();
    }
}

数据访问层:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
public class DAL
{
    SqlConnection xconn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionStrings"].ToString());
    public DataTable populateCountry()
    {
        SqlDataAdapter da = new SqlDataAdapter("select * from Development.dbo.Country", xconn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
    public DataTable populateStates(int selectedCountry)
    {
        SqlDataAdapter da = new SqlDataAdapter("select * from Development.dbo.States where CountryID='"+selectedCountry+"'", xconn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
}

我错过了什么吗?我认为页面中的控件位于_Default类下,因此如果我们创建一个_Default类的对象并尝试访问静态方法中的控件,它应该可以工作,但奇怪的是它不是。 任何帮助或指示将不胜感激。

-regards 阿努拉格

0 个答案:

没有答案