#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) {
}
});
}