【问题标题】:ASP.Net Core - Store and Retrieve FormCollection in SQL Server databaseASP.Net Core - 在 SQL Server 数据库中存储和检索 FormCollection
【发布时间】:2020-10-22 04:13:44
【问题描述】:

我有一个从用户那里收集一长串输入的剃须刀表单。我需要将数据存储在 SQL Server 中。但我不想在 SQL Server 表中创建那么多列。所以我的想法是有一个nvarchar(max) 类型的列FormData,将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 来检索它。返回数据包含转义字符,我认为这就是导致问题的原因。

表单数据:

[
  {
    "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() 删除这些转义字符,但我不确定这是否是个好主意。如果找不到更好的解决方案,我可能最终会这样做。

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

反序列化代码:

只是为了测试,我在序列化后立即尝试反序列化,但失败了。

JSON.stringify(data)的Ajax调用结果:

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, '"');

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

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

        }
    });
}

去掉转义字符后,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) {

        }
    });
}

【问题讨论】:

  • 反序列化时遇到什么问题?可以分享一下反序列化的代码吗?
  • 我用屏幕截图更新了我的帖子,以显示反序列化代码和错误消息。
  • 我修复了我的 JavaScript 代码,它现在可以工作了。
  • 反序列化代码仍然不起作用。但现在对我来说并不重要。我在 ajax 调用中获取 JSON 数据,并且能够解析它。

标签: c# json sql-server asp.net-core razor


【解决方案1】:

删除了转义字符,它解决了问题。

这些行在下面的 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) {

        }
    });
}

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2023-03-21
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多