陷入一个奇怪的问题,希望这里的专家能够提供帮助。 当下拉列表 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中,因此我创建了此部分类的对象,并尝试通过此对象访问下拉列表控件。
但令我惊讶的是,我收到了一个NullReference异常。通过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 阿努拉格