ASP.Net Ядро — хранить и извлекать FormCollection в базе данных SQL Server

#c# #json #sql-server #asp.net-core #razor

#c# #json #sql-сервер #asp.net-ядро #razor

Вопрос:

У меня есть форма razor, которая собирает длинный список входных данных от пользователя. Мне нужно сохранить данные в SQL Server. Но я не хочу создавать так много столбцов в таблице SQL Server. Итак, моя идея заключалась в том, чтобы создать столбец FormData типа nvarchar(max) , преобразовать FormCollection объект в Json и сохранить его table.FormData .

 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(IFormCollection collection)
{
    try
    {
        string json = JsonConvert.SerializeObject(collection);

        MyObject form = new MyObject()
        {
            id = 1,
            formdata = json
        };

        repository.Add(form);

        return RedirectToAction(nameof(Index));
    }
    catch
    {
        return View();
    }
}
  

Хранение данных работает нормально, но когда я их извлекаю, происходит сбой десериализации.

Я написал API для его извлечения. Возвращаемые данные содержат escape-символы, и я считаю, что именно это вызывает проблему.

FormData:

 [
  {
    "id": 1,
    "formdata": "[{"Key":"Name","Value":["Person1"]},{"Key":"EmpID","Value":["12345"]},{"Key":"inputDepartment","Value":[""]},{"Key":"inputLocation","Value":[""]},{"Key":"inputSupervisor","Value":[""]},{"Key":"inputExitDate","Value":[""]},{"Key":"optShouldEmailBeActive","Value":["on"]},{"Key":"optWhoHasAccess","Value":["on"]},{"Key":"__RequestVerificationToken","Value":["CfDJ8M9krkWO1eBMp3rh5qzs-Rv1bj07MLUgOrWTcXV-ivrIiXkHW30I0e0NYWuBtbvyjONlULoENzivw1NXfITYL1Y8CVIOoDgFW_ACPu9XLhHe8x5KUcOZ-FuLeXyR-Vj0Q7RE_lSmnDchZsB6ihVyW4bnFcKAjo9X62rknPNUHvvEjsIN7-1EHtrgMT2-TgLPkQ"]}]",
  }
]
  

Я не смог найти способ избежать использования этих управляющих символов при сериализации.
Я думал об использовании .replace() для удаления этих управляющих символов перед сохранением, но я не уверен, что это хорошая идея. Я могу в конечном итоге сделать это, если не смогу найти лучшее решение.

============================

Код десериализации:

Просто для тестирования я попробовал десериализацию сразу после сериализации, и это не удалось.

введите описание изображения здесь

Результат Ajax-вызова JSON.stringify(данные):

введите описание изображения здесь

Код Javascript:

Пытался удалить escape-символы.

 function getData() {
    var url = baseURL   "api/itexit";

    $.ajax({
        url: url,
        type: "GET",
        success: function (data) {
            var json = JSON.stringify(data);
            json = json.replace(/\"/g, '"');

            alert(json);
            var obj = JSON.parse(json);

            var a = "";
            $.each(obj, function (index) {
                a  = obj[index].Key   "n";
            });
            alert(a);
        },
        error: function (data) {

        }
    });
}
  

После удаления escape-символов, alert(json):
введите описание изображения здесь

Ошибка в консоли разработчика Chrome:

Эта ошибка находится в JSON.parse(json);

введите описание изображения здесь

=============================================

Обновить:

После исправления кода javascript он работает:

 function getData() {
    var url = baseURL   "api/itexit";

    $.ajax({
        url: url,
        type: "GET",
        success: function (data) {
            var json = JSON.stringify(data);
            json = json.replace(/\"/g, '"');
            json = json.replace('"[', '[');
            json = json.replace(']"', ']');

            var obj = JSON.parse(json);
            obj = obj[0].formdata;

            $.each(obj, function (index) {
                var o = obj[index];
                $("#"   o.Key).val(o.Value);
            });
        },
        error: function (data) {

        }
    });
}
  

Комментарии:

1. С какой проблемой вы сталкиваетесь при десериализации? Можете ли вы поделиться кодом десериализации?

2. Я обновил свой пост скриншотами, чтобы показать код десериализации и сообщения об ошибках.

3. Я исправил свой код JavaScript, и теперь он работает.

4. Код десериализации по-прежнему не работает. Но для меня сейчас это не важно. Я получаю данные JSON в вызове ajax и могу их проанализировать.

Ответ №1:

Удалены escape-символы, это устранило проблему.

Эти строки выполнили трюк в следующем методе javascript getData().

 var json = JSON.stringify(data);
json = json.replace(/\"/g, '"');
json = json.replace('"[', '[');
json = json.replace(']"', ']');
  

Javascript:

 function getData() {
    var url = baseURL   "api/itexit";

    $.ajax({
        url: url,
        type: "GET",
        success: function (data) {
            var json = JSON.stringify(data);
            json = json.replace(/\"/g, '"');
            json = json.replace('"[', '[');
            json = json.replace(']"', ']');

            var obj = JSON.parse(json);
            obj = obj[0].formdata;

            $.each(obj, function (index) {
                var o = obj[index];
                $("#"   o.Key).val(o.Value);
            });
        },
        error: function (data) {

        }
    });
}