Jquery 不能';t使用Ajax调用服务器端方法

Jquery 不能';t使用Ajax调用服务器端方法,jquery,asp.net,ajax,3-tier,Jquery,Asp.net,Ajax,3 Tier,我使用3层体系结构来演示应用程序 我试图使用Ajax从表示层调用业务逻辑层方法。但它显示出错误。我认为传递url时有一些错误 下面是演示层中Index.aspx页面的Ajax调用: $.ajax({ type: "GET", url: "DemoApplication.BLL/BLL/ShowDetail", contentType: "application/json; charset=utf-8", dataType: "json", data: {

我使用3层体系结构来演示应用程序

我试图使用Ajax从表示层调用业务逻辑层方法。但它显示出错误。我认为传递url时有一些错误

下面是演示层中Index.aspx页面的Ajax调用:

$.ajax({
    type: "GET",
    url: "DemoApplication.BLL/BLL/ShowDetail",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: { },
    success: function (msg) {
        alert("data received");
    },
    error: function () {
        alert("couldn't proceed");
    }
});
下面是我在业务逻辑层的方法:

namespace DemoApplication.BLL
{
    public class BLL
    {
        public static List<User> ShowDetail()
        {
            DAL.DAL dal = new DAL.DAL();
            return dal.ShowDetail();
        }
    }
}
namespace DemoApplication.BLL
{
公共类BLL
{
公共静态列表ShowDetail()
{
DAL.DAL=新的DAL.DAL();
返回dal.showtail();
}
}
}

我认为您有点困惑,如果您试图从浏览器中调用中间层方法,则可能有问题。如果这一点得到支持,请思考其影响。在我的业务逻辑层中,我可能有一些从未从表示层公开的方法。可能是某个后端维护工具使用的DropClientDatabase()。如果我可以通过JavaScript直接调用这个方法呢?这意味着任何有一点HTML和JavaScript技能的人都可以调用DropClientDatabase(),给用户带来很多问题。由于此方法位于BLL层,可以想象它不直接执行任何类型的身份验证检查(这可能是调用它的先决条件),因此任何人都可以删除数据库。我们当然不希望这样

我们需要明确定义可以从AJAX调用的方法,部分是作为一种安全手段。业务层中的
List showdeail()
方法应该从表示层代码(aspx.cs)中调用,如下所示

[WebMethod]
public static List<User> ShowDetail()
{
    //Call your method something like this
    var myVar = BLL.ShowDetail();
    //This will return your list in a JSON Format
    return myVar;
}

以下是我在项目中的实施方式:

AJAX

$.ajax({
        url: 'DataViewer.aspx/GetData',
        dataType: "json",
        type: 'POST',
        data: {},
        contentType: "application/json; charset=utf-8",
        success: function (data) {           
        },
        error: function (d) {

        }
    });
ASP.NET

public partial class DataViewer: System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        [WebMethod]
        public static List<UserResult> GetData()
        {
            //No need to manually serialize the generic list
            return UserInfo.GetData();
        }
public部分类DataViewer:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
}
[网络方法]
公共静态列表GetData()
{
//无需手动序列化通用列表
返回UserInfo.GetData();
}
注:


代码隐藏中的方法应具有
[WebMethod]
属性,它应该是
public static

您需要调用的web方法,它不能是任何服务器方法。url不应该是类的路径…它应该是Index.aspx/TheMethod,其中TheMethod是Index.aspx上的web方法。您不能只调用世界上的任何方法…那会非常可怕!D使用
[WebMethod]
@dman2306方法对函数进行ecorate与表示层在相同的解决方案中,但在不同的解决方案中projet@mhu我已经用[WebMethod]装饰了这个方法但是仍然有错误奇怪,为什么你要调用序列化程序而不是仅仅返回myVar;让框架来处理它?@dman2306很好,我认为框架不能处理转换本身,因为它不是一个字符串,是一个列表变量,返回方法的是什么,但是读取文档,它看起来像是内部调用我已经准备好了,说得好
public partial class DataViewer: System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        [WebMethod]
        public static List<UserResult> GetData()
        {
            //No need to manually serialize the generic list
            return UserInfo.GetData();
        }