Отправить на SQL Сервер от AJAX JSON -> Веб-метод - PullRequest
0 голосов
/ 18 апреля 2020

Я работал над решением для получения данных с веб-страницы, отправленной через AJAX в WebMethod, и в конечном итоге в базу данных. Я застрял в том, что я делаю с блоком кода веб-метода после завершения метода AJAX Get.

Вот мой 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"
    });
}

Вот мой веб-метод и Publi c Класс

[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; }
}

Как вы можете видеть, в моем веб-методе Я застрял, как получить доступ к этим JSON данным и что-то с ними сделать. Это то, что я пытался, и это не работает вообще. Могу ли я что-нибудь сделать, чтобы это исправить, или мне нужен другой подход? Возникающая ошибка (которая в любом случае может быть не единственной неправильной) заключается в том, что она не может преобразовать из Generic.List в строку (в случае раздела динамического c содержимого ....)

[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";
}

Я удаленно на правильном пути или нет?

1 Ответ

0 голосов
/ 18 апреля 2020

Вы на правильном пути. Несколько вещей, о которых стоит упомянуть

1) эта строка не нужна

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

, поскольку ASP. NET уже выполнила преобразование строки JSON в класс People для вас метод UpdateOnDemand(List<People> PeopleToUpdate) уже имеет десериализованную модель.

2) вы можете l oop через совокупность людей

foreach (var person in PeopleToUpdate)

3), если ваш домен Модель состоит из нескольких классов с взаимосвязями между ними, вы можете рассмотреть возможность использования ORM, такого как Entity Framework для уровня данных.

4) структура решения может быть изменена, пример структуры проектов

  • MySolution.Data (доступ к данным)
  • MySolution.Business (для бизнес-компонентов, использует данные)
  • MySolution.Web (использует Business)
  • 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...