首页 > 解决方案 > 从 AJAX JSON 提交到 SQL Server --> Web 方法

问题描述

我一直在研究一种解决方案,从通过 AJAX 提交到 WebMethod 的网页中获取数据,并最终进入数据库。Get一旦 AJAX方法完成,我对如何处理 Web 方法代码块感到困惑。

这是我的 AJAX

function UpdatePeople() {
    var PeopleToUpdate = [
            { "name": "John", "age": "17" },
            { "name": "Harry", "age": "19" },
            { "name": "Steve", "age": "23" }
        ];

    jQuery.ajax({
        url: '_ajax_updatepeople.aspx/UpdateOnDemand',
        type: "POST",
        data: JSON.stringify({'PeopleToUpdate' : PeopleToUpdate }),
        dataType: "json"
    });
}

这是我的 Web 方法和公共类

[WebMethod]
public string UpdateOnDemand(List<People> PeopleToUpdate)
{
    // What do I do here ?????
}

public class People
{
    public string name { get; set; }

    public string age { get; set; }
}

如您所见,在我的 Web 方法中,我对如何访问这些 JSON 数据并对其进行处理感到困惑。这是我尝试过的,它根本不起作用。我可以做些什么来纠正这个问题,还是我需要采取另一种方法?出现的错误(无论如何这可能不是唯一的错误)是无法转换Generic.List为 String (在动态内容的情况下......部分)

[WebMethod]
public string UpdateOnDemand(List<People> PeopleToUpdate)
{
    dynamic content = JsonConvert.DeserializeObject<People>(PeopleToUpdate);

    foreach (var Item in content)
    {
        SqlConnection myConnection = null;
        SqlCommand sqlCmd = null;

        try
        {
            myConnection = DBConnectConfig.openDBConnection();

            sqlCmd = new SqlCommand("Insert Into Users (Name, Age) VALUES (@Name, @Age)");
            sqlCmd.CommandType = System.Data.CommandType.Text;
            sqlCmd.Connection = myConnection;
            sqlCmd.Parameters.AddWithValue("@Name", Item.name);
            sqlCmd.Parameters.AddWithValue("Age", Item.age);
            sqlCmd.ExecuteNonQuery();

        }
        finally
        {
            DBConnectConfig.disposeDBObjects(myConnection, sqlCmd);
        }
    }

    return "People added to the database";
}

我是在正确的轨道上,还是根本没有?

标签: c#jsonsql-serverajax

解决方案


你在正确的轨道上。有几点要提

1)不需要这条线

dynamic content = JsonConvert.DeserializeObject<People>(PeopleToUpdate);

因为 ASP.NET 已经People为您完成了从 JSON 字符串到类的转换,所以该方法UpdateOnDemand(List<People> PeopleToUpdate)已经具有反序列化模型。

2)你可以遍历人的集合

foreach (var person in PeopleToUpdate)

3)如果你的领域模型由多个类组成,它们之间有关系,你可以考虑使用 ORM,比如数据层的实体框架。

4)可以修改解决方案的结构,项目结构的一个例子

  • MySolution.Data(数据访问)
  • MySolution.Business(对于业务组件,使用数据)
  • MySolution.Web(使用业务)
  • MySolution.Data.Test(用于测试数据访问层的 xUnit/NUnit 项目)

业务组件示例

public class PeopleService: IPeopleService
{
    public PeopleService(/* inject settings with connection string */)
    {
    }

    public void UpdatePeople(List<People> people)
    {
        var dal = new DALContext(.. connection string from settings);
        data.UpdatePeople(people);
    }
}

DAL 组件:

public class DALContext
{
    // this method can be unit tested:
    public void UpdatePeople(List<People> people)
    {
        .. code for database operations
    }
}

推荐阅读